sql server-OPENROWSET:sp_executesql语句在@param处失败



我正在开发一个程序来拉入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执行查询没有区别。

相关内容

  • 没有找到相关文章

最新更新