使用光标删除所有同义词

时间:2011-05-11 21:24:13

标签: sql-server-2008r2-express

我想使用游标删除数据库的所有同义词(sql server 2008 r2)。 environment-database name-'mydatabase',schema name-'dbo'.. 你可以指导我,因为我尝试但是...结束时的声明,是不能删除同义词。 什么逻辑应该适用于w.r.t光标?

2 个答案:

答案 0 :(得分:15)

无需使用游标。按照设定:

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 :(得分:2)

与杰森的答案类似,但有一些改进

  • 使用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