【问题标题】:syntax issue with alter database and set commandalter database 和 set 命令的语法问题
【发布时间】:2011-12-17 21:02:06
【问题描述】:

您好,我想运行一个 alter database 语句并不断收到错误消息: (这是在一个将针对多个数据库运行的脚本中)

SELECT is_broker_enabled FROM sys.databases WHERE name = db_name()

DECLARE @SQL NVARCHAR(1024)


IF (SELECT is_broker_enabled FROM sys.databases WHERE name = db_name()) = 0
BEGIN

    SET @SQL = N'ALTER DATABASE [' + db_name() + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE';
    SELECT @SQL;
    sp_executesql @SQL;

    SET @SQL = N'ALTER DATABASE [' + db_name() + '] SET ENABLE_BROKER';
    SELECT @SQL;
    sp_executesql @SQL;


    SET @SQL = N'ALTER DATABASE [' + db_name() + '] SET MULTI_USER';
    SELECT @SQL;
    sp_executesql @SQL;

END 

SELECT is_broker_enabled FROM sys.databases WHERE name = db_name()

我不断得到

消息 102,级别 15,状态 1,第 11 行 “sp_executesql”附近​​的语法不正确。 消息 102,第 15 级,状态 1,第 15 行 “sp_executesql”附近​​的语法不正确。 消息 102,第 15 级,状态 1,第 20 行 'sp_executesql' 附近的语法不正确。

我在做一些愚蠢的事情 - 但就像大多数语法问题一样,看起来并不会引起看到......

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    只允许作为批处理的第一行调用不带 EXEC 的存储过程。你的电话不是。

    您是否也考虑过这种构造可以一次性完成?

    SET @SQL = N'
     ALTER DATABASE [' + db_name() + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
     ALTER DATABASE [' + db_name() + '] SET ENABLE_BROKER;
     ALTER DATABASE [' + db_name() + '] SET MULTI_USER;
    ';
    SELECT @SQL;
    EXEC sp_executesql @SQL;
    

    【讨论】:

    • 不确定您对 exec 是否是批处理中的第一行的评论-我知道它对于 create 是正确的-但即使您没有将它作为第一行...经过一些测试- 它添加的 EXEC 导致它工作。别担心,我因为错过了高管而感到愚蠢!
    • @Ian P:这意味着您可以在第一行代码中省略 EXEC only。任何其他存储过程调用都需要 EXEC。
    • 不知道 - 但我想它必须是真的,否则在 SSMS 中突出显示一个 proc 和 将不起作用。仍然希望我不会再忘记这位高管 5 年
    【解决方案2】:

    尝试使用 exec 关键字,如下所示:

    exec sp_executesql @SQL;
    

    这就是从存储过程内部调用另一个存储过程的方式(您也可以使用EXECUTE,它的作用完全相同)。注意不要将其与 Exec(...) 函数 (see also here) 混淆。

    【讨论】:

      【解决方案3】:

      试试这个:

         EXECUTE sp_executesql @SQL;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-30
        • 2012-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多