【问题标题】:Drop all the synonyms using cursor使用光标删除所有同义词
【发布时间】:2011-08-23 16:05:39
【问题描述】:

我想使用游标删除数据库(sql server 2008 r2)的所有同义词。 环境-数据库名称-'mydatabase',模式名称-'dbo'.. 您能否像我尝试的那样指导我,但是 while .. end 的声明无法删除同义词。 w.r.t 游标应该应用什么逻辑?

【问题讨论】:

    标签: sql-server-2008r2-express


    【解决方案1】:

    无需使用光标。按照设定做:

    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
    

    【讨论】:

      【解决方案2】:

      与 Jason 的回答类似,但有一些改进

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

      【讨论】:

        猜你喜欢
        • 2018-04-14
        • 2017-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-20
        • 1970-01-01
        • 1970-01-01
        • 2018-06-06
        相关资源
        最近更新 更多