OPENROWSET:sp_executesql 语句在 @param 处失败

OPENROWSET: sp_executesql statement failing at @param

我正在开发一个程序来提取 XML 文件,WordPress 允许您下载(本质上是一个备份副本)。

在这一点上,我正在自动化该过程以允许在 SQL Server 上频繁备份我的数据,并且出于某种原因,我一直坚持开发对 运行 和 OPENROWSET 的查询XML 文件所在的位置。

DECLARE @SQL NVARCHAR(MAX)
DECLARE @ParamDefinition NVARCHAR(500) = N'@fstring NVARCHAR(MAX)'
DECLARE @string VARCHAR(MAX) = 
N'C:\[FilePath]\Reviews\thehesperian2016-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'.

我可以将其转换为对谓词中 table 的简单查询,因此我有理由怀疑这是读取 filepath 的方式。 我花了几个小时绞尽脑汁想弄清楚为什么这是错误的。虽然我可以像 BULKINSERT 中的 example 那样使用 QUOTENAME,但我希望将所有这些嵌入到动态 SQL 中(因此仍然使用 sp_executesql

我做错了什么或为什么做错了?任何帮助将不胜感激。 - 问候,

回答

OPENROWSET - MSDN 在自己的段落中声明:

OPENROWSET does not accept variables for its arguments.

QUOTENAME 就足够了,尽管我还是 运行 做了一些小的 REPLACE 功能。

OPENROWSET函数的数据文件路径不允许参数。相反,使用文字构建所需的字符串:

DECLARE @string varchar(MAX) = N'C:\[FilePath]\Reviews\thehesperian2016-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 queries are not autoparameterized。在此处使用 sp_executesqlEXECUTE 执行查询没有区别。