OPENROWSET:sp_executesql语句在@param失败

时间:2016-07-29 18:58:16

标签: sql-server wordpress filepath openrowset sp-executesql

我正在开发一个程序来提取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'.

错误:

filepath

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

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

ANSWER

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

  

OPENROWSET不接受其参数的变量。

REPLACE就足够了,不过我确实运行了一些小 FATAL EXCEPTION: main Process: com.milos.sportisa, PID: 2735 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.milos.sportisa/com.milos.sportisa.SplashActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setTypeface(android.graphics.Typeface)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setTypeface(android.graphics.Typeface)' on a null object reference at com.milos.sportisa.SplashActivity.onCreate(SplashActivity.java:29) at android.app.Activity.performCreate(Activity.java:5933) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)  at android.app.ActivityThread.access$800(ActivityThread.java:144)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:135)  at android.app.ActivityThread.main(ActivityThread.java:5221)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 个功能。

1 个答案:

答案 0 :(得分: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);

<强>更新

如果提供的文件路径来自不受信任的来源,则添加QUOTENAME。另请注意OPENROWSET queries are not autoparameterized。是否在此处使用sp_executesqlEXECUTE执行查询没有区别。