我正在开发一个程序来拉入XML
文件,WordPress
使您能够下载该文件(本质上是一个备份副本)。
在这一点上,我正在自动化该过程,以便在SQL Server
上频繁备份我的数据,出于某种原因,我一直在开发查询以运行XML
文件所在的OPENROWSET
。
DECLARE @SQL NVARCHAR(MAX)
DECLARE @ParamDefinition NVARCHAR(500) = N'@fstring NVARCHAR(MAX)'
DECLARE @string VARCHAR(MAX) =
N'C:[FilePath]Reviewsthehesperian2016-07-29.xml'
SET @SQL =
N'INSERT INTO #Temp (Extract_Date, XMLDATA)
SELECT GETDATE()
, A.*
FROM OPENROWSET(BULK @fstring, SINGLE_BLOB, CODEPAGE = ' + '''RAW''' + ') AS A'
EXEC sp_executesql @SQL
, @ParamDefinition
, @fstring = @string
错误:
Msg 102, Level 15, State 1, Line 4
Incorrect syntax near '@fstring'.
我可以将其转换为对谓词中的表的简单查询,因此我有理由怀疑这就是读取filepath
的方式。我花了几个小时绞尽脑汁想弄清楚为什么这是错误的。虽然我可以在BULKINSERT中使用QUOTENAME
,但我希望将所有这些嵌入到动态SQL中(因此仍然使用sp_executesql
)
我做错了什么或为什么做错了?任何帮助都将不胜感激。-问候,
答案
OPENROWSET-MSDN在自己的段落中声明:
OPENROWSET不接受变量作为其参数。
QUOTENAME
就足够了,尽管无论如何我确实运行了一些次要的REPLACE
函数。
OPENROWSET函数的数据文件路径不允许参数。相反,使用以下文字构建所需的字符串:
DECLARE @string varchar(MAX) = N'C:[FilePath]Reviewsthehesperian2016-07-29.xml';
DECLARE @SQL nvarchar(MAX);
SET @SQL =
N'INSERT INTO #Temp (Extract_Date, XMLDATA)
SELECT GETDATE()
, A.*
FROM OPENROWSET(BULK ' + QUOTENAME(@string, '''') + ', SINGLE_BLOB, CODEPAGE = ''RAW'') AS A';
EXEC sp_execute @SQL;
--EXECUTE(@SQL);
更新:
如果提供的文件路径来自不受信任的来源,则添加了QUOTENAME。另外,请注意,OPENROWSET查询不是自动参数化的。在这里用sp_executesql
还是EXECUTE
执行查询没有区别。