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_executesql
或 EXECUTE
执行查询没有区别。
我正在开发一个程序来提取 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_executesql
或 EXECUTE
执行查询没有区别。