2016-07-29 120 views
0

我正在開發一個程序來拉XML文件,WordPress使您可以下載(本質上是一個備份副本)。OPENROWSET:sp_executesql語句在@param失敗

此時我正在自動化該過程,以允許在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'. 

我可以把它變成在謂語表一個簡單的查詢,所以我有理由懷疑它是filepath被讀取的方式。 我花了幾個小時來試圖弄清楚爲什麼這是錯的。雖然我可以在BULKINSERT在此example使用QUOTENAME的,我希望能嵌入所有的,在動態SQL(因此仍使用sp_executesql

什麼,或者爲什麼我這樣做不對?任何幫助將不勝感激。 - 問候,

ANSWER

OPENROWSET - MSDN宣佈在自己的一段話:

OPENROWSET does not accept variables for its arguments.

QUOTENAME就足夠了,雖然我沒有反正跑幾個小REPLACE功能。

+0

在您的動態SQL中,@fstring被視爲文字而不是變量。 – scsimon

+0

@scsimon right,忘記提及我通過proc參數調用fstring,所以SQL Server不應該從我的理解中猜出來。 –

+0

對於動態SQL,您必須使用+'''@var'''+ Concat,但仍不確定它是否在OPENROWSET中。我不認爲它會工作 – scsimon

回答

1

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); 

UPDATE:

新增QUOTENAME的情況下,所提供的文件路徑是從不受信任的來源。另外請注意,OPENROWSET queries are not autoparameterized。在這裏執行sp_executesqlEXECUTE的查詢是沒有區別的。

+0

這確實破壞了使用sp_executesql的要點。另外,我沒有提及@fstring在proc中作爲參數被調用...所以理論上,SQL服務器應該能夠把它當作一個變量,對吧? –

+0

@clifton_h,如果這是您的偏好,您可以使用'sp_executesql @ SQL'而不是'EXEC(@SQL)',但如果沒有參數,則不需要這樣做。文件名參數只允許使用文字字符串。 OPENROWSET不允許參數AFAIK。 –

+0

我會接受你的答案,除非它需要通過'QUOTENAME(@string,NCHAR(39))'清理變量。避免惡意使用。 –