【发布时间】: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