通过在T-SQL中将值作为局部变量传递来设置COMPATIBILITY LEVEL

时间:2013-10-03 15:19:03

标签: sql sql-server compatibility

我正在努力让这段代码工作。

定位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没有必要,是的,我也可以在DB_name()中使用sp_dbcmptlevel,是的,我可以使用ALTER TABLE,是的,IF 1}}在SQL 2012中返回错误的值,但痛苦的是它根本无法在SQL Studio中执行。错误消息是:

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

如何将局部变量@level / @levelvar传递给此存储过程?

1 个答案:

答案 0 :(得分:2)

您的代码段中存在两个语法错误。 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;