2011-05-11 64 views
4

我想使用光標刪除數據庫(sql server 2008 r2)的所有同義詞。 environment-database name-'mydatabase',schema name-'dbo'.. 可以請你引導我,因爲我曾嘗試過但while語句結束,不能刪除同義詞。 什麼邏輯應該適用w.r.t光標?使用光標刪除所有同義詞

回答

14

無需使用遊標。難道它集:

declare @n char(1) 
set @n = char(10) 

declare @stmt nvarchar(max) 

select @stmt = isnull(@stmt + @n, '') + 
'drop synonym [' + SCHEMA_NAME(schema_id) + '].[' + name + ']' 
from sys.synonyms 

exec sp_executesql @stmt 
1

傑森的回答類似的一些改進

  • 使用QUOTENAME()函數來包裝名在方括號
  • 的@SQL變量初始化爲空字符串,這意味着isnull不是必需的,並且意味着當您將查詢結果連接到單個字符串時,它不會得到錯誤的類型。串聯中的字符串文字可以採用默認的nvarchar大小,並導致您的結果字符串被意外截斷。
  • 通過在它們前面使用N來確保字符串文字也是nvarchar。
  • 只根據OP要求過濾到dbo模式。
  • sys架構添加到sp_executesql的調用

完全同意,這是不是你需要的東西光標。

DECLARE @SQL NVARCHAR(MAX) = N'' 
SELECT @SQL += N'DROP SYNONYM ' + QUOTENAME(SCHEMA_NAME([schema_id])) + N'.' + QUOTENAME(name) + N';' + Char(13) + Char(10) 
FROM sys.synonyms 
WHERE SCHEMA_NAME([schema_id]) = N'dbo' 

EXEC sys.sp_executesql @SQL