【问题标题】:Set COMPATIBILITY LEVEL by passing value as local variable in T-SQL通过在 T-SQL 中将值作为局部变量传递来设置 COMPATIBILITY LEVEL
【发布时间】:2013-10-03 15:19:03
【问题描述】:

我正在尝试让此代码片段正常工作。

面向 SQL 2005 SP2 和更新的 SQL Server 产品。

代码:

BEGIN
DECLARE @level tinyint;
DECLARE @levelvar tinyint;
IF substring(@@VERSION, 23, 4) != '2000'
BEGIN
  select @level = [compatibility_level] from sys.databases where name = DB_name();
  SET @levelvar = @level;
  EXEC sp_dbcmptlevel ":DATABASE_NAME" @level;
END;

是的,@levelvar 不是必需的,是的,我也可以在 sp_dbcmptlevel 中使用 DB_name(),是的,我可以使用 ALTER TABLE,是的,IF 在 SQL 2012 中返回错误值,但痛苦的是它根本无法在 SQL Studio 中执行。错误信息是:

Msg 102, Level 15, State 1, Line 9
Incorrect syntax near '@level'.

如何获取局部变量@level/@levelvar传递给这个存储过程?

【问题讨论】:

  • :DATABASE_NAME 来自 SQLCMD 模式吗?否则我不太明白这将如何执行。另外,您为什么要获得当前的兼容性级别并将数据库设置为相同的东西?是不是像UPDATE dbo.table SET col = col;
  • 您也能准确解释一下您要做什么吗?
  • 感谢 Aaron 的支持,但这里的需求并不是很重要。这只是我最近更新的curvehands.dll,在写这个小语句时,所以我不知何故没有看到缺少逗号和END。 :(

标签: sql sql-server compatibility


【解决方案1】:

您的代码 sn-p 中有两个语法错误。调用 sp_dbcmptlevel 时缺少逗号,外部块 BEGIN 缺少 END。这个版本为我编译:

BEGIN
    DECLARE @level tinyint;
    DECLARE @levelvar tinyint;
    IF SUBSTRING(@@VERSION, 23, 4) != '2000'
    BEGIN
      SELECT @level = [compatibility_level] FROM sys.databases WHERE name = DB_NAME();
      SET @levelvar = @level;
      EXEC sp_dbcmptlevel ":DATABASE_NAME", @level;
    END;
END;

【讨论】:

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