必须在 SQL 服务器中声明标量变量“ ”错误

Must declare the scalar variable ' ' error in SQL Server

我需要向 table 添加一个不为空且具有默认日期时间的新列。但我得到如下错误。我检查了多个实例,但出现错误。

DECLARE @SQL NVARCHAR(1000), @date NVARCHAR(1000);
SET @date = '9999-12-31 00:00:00.000'

SET @SQL = 'ALTER TABLE [spi].[ProductClass]
                ADD lastUpdatedTime datetime NOT NULL
                    CONSTRAINT default_updateTime DEFAULT @date';

EXEC sp_executesql @SQL;

这是我得到的错误。

Must declare the scalar variable "@date".

有什么解决办法吗?

您正在寻找的内容如下所示,您可以通过串联

创建动态 SQL
DECLARE @SQL NVARCHAR(1000), @date NVARCHAR(1000);
SET @date = '9999-12-31 00:00:00.000'

SET @SQL = 'ALTER TABLE [spi].[ProductClass]
                ADD lastUpdatedTime datetime NOT NULL
                    CONSTRAINT default_updateTime DEFAULT '''+ @date+'''';

EXEC sp_executesql @SQL;

如果您将 @date 替换为值,它将起作用。

但让我们看看为什么它不起作用。你的 SQL:

DECLARE @SQL NVARCHAR(1000), @date NVARCHAR(1000);
SET @date = '9999-12-31 00:00:00.000'

SET @SQL = 'ALTER TABLE [spi].[ProductClass]
                ADD lastUpdatedTime datetime NOT NULL
                    CONSTRAINT default_updateTime DEFAULT @date';

EXEC sp_executesql @SQL;

声明了几个变量并执行其中一个变量代表的 SQL 块。你的问题是 sp_executesql 将一些文本读取为 SQL 并尝试 运行 它 - 如果你不能 运行 你告诉它给 运行 的内容,那么不能。

因此,如果您打开一个新查询 window 并尝试 运行:

ALTER TABLE [spi].[ProductClass]
    ADD lastUpdatedTime datetime NOT NULL
        CONSTRAINT default_updateTime DEFAULT @date

它会崩溃试图弄清楚 @date 应该是什么。

DECLARE @date NVARCHAR(1000);

SET @date = '9999-12-31 00:00:00.000';

ALTER TABLE [spi].[ProductClass]
    ADD lastUpdatedTime datetime NOT NULL
        CONSTRAINT default_updateTime DEFAULT @date;

会起作用,或者简单地说:

ALTER TABLE [spi].[ProductClass]
    ADD lastUpdatedTime datetime NOT NULL
        CONSTRAINT default_updateTime DEFAULT '9999-12-31 00:00:00.000';

因此,使用串联你可以做到:

DECLARE @SQL NVARCHAR(1000), @date NVARCHAR(1000);
SET @date = '9999-12-31 00:00:00.000'
    
SET @SQL = 'ALTER TABLE [spi].[ProductClass]
                ADD lastUpdatedTime datetime NOT NULL
                    CONSTRAINT default_updateTime DEFAULT ' + @date;

EXEC sp_executesql @SQL;    

这会给您带来不同的错误,因此请尝试在 date 变量中包含一对引号:

DECLARE @SQL NVARCHAR(1000), @date NVARCHAR(1000);
SET @date = '''9999-12-31 00:00:00.000'''
    
SET @SQL = 'ALTER TABLE [spi].[ProductClass]
                ADD lastUpdatedTime datetime NOT NULL
                    CONSTRAINT default_updateTime DEFAULT ' + @date;

EXEC sp_executesql @SQL;