【问题标题】:SQL Server - "must declare scalar variable" error message even though I have just declared itSQL Server - “必须声明标量变量”错误消息,即使我刚刚声明了它
【发布时间】:2018-07-10 12:12:41
【问题描述】:

我正在尝试在 SQL Server 2014 中编写一个脚本,以导入一系列文件名中包含日期的文件。我将每天运行它,每天的导出文件名中都有相应的日期。我想将日期设置为变量,以避免必须通过脚本并将日期输入到导入语句的每个文件路径中(每天将有大约 20 个不同的报告)。

这就是我现在拥有的:

DECLARE @date VARCHAR(50)
DECLARE @engagements VARCHAR(MAX)
DECLARE @findings VARCHAR(MAX)

SET @date = '20180708'
GO

SET @engagements = 'bulk insert dbo.engagements
from ''\\sanascl\users$\MG3976\My Documents\Report Exports\' + @date + '-Engagements_sqltest.txt''
WITH
    (
    FIRSTROW = 2,
    fieldterminator = ''\t'',
    ROWTERMINATOR = ''\n''
    )
'
GO

SET @findings = 'bulk insert dbo.findings
from ''\\sanascl\users$\MG3976\My Documents\Report Exports\' + @date + '-findings_sql.txt''
WITH
    (
    FIRSTROW = 2,
    fieldterminator = ''\t'',
    ROWTERMINATOR = ''\n''
    )
'
GO

EXEC(@engagements)
GO
EXEC(@findings)
GO

但是,当我运行它时,我得到了

消息 137,第 15 级,状态 2,第 8 行
必须声明标量变量“@date”

并且对于调用@date 变量的每一行都会重复该错误消息。此外,其他变量在其各自的Exec 语句中重复错误。

我尝试重新排列声明和设置语句,但没有任何效果 - 请帮助!

【问题讨论】:

  • 您的问题是GO 语句;他们每个人都开始一个全新的代码块,忽略前一个
  • 可能想研究参数化或类似的。如果date 是一个输入变量,那么你就很容易被注入。
  • 您的WITH 语句也会出错,因为您没有用分号 (;) 完成任何语句。您应该用一个来终止每个语句,不这样做是不推荐使用的功能。但是,WITH 语句要求终止前一个语句。 (注意:; 不是“初学者,就像有些人认为的那样。使用 ;WITH 不是解决方案,正确终止您的陈述是。)

标签: sql-server variables sql-server-2014 variable-declaration


【解决方案1】:

SQL Server 中的 GO 执行批处理并清除您的变量。

DECLARE @testing INT = 0

SELECT @testing 

GO 

SELECT @testing

删除它,它会工作

DECLARE @testing INT = 0

SELECT @testing 
SELECT @testing

【讨论】:

    猜你喜欢
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多