将OpenRowSet与参数化文件名一起使用

时间:2016-09-12 18:12:24

标签: c# sql xml dynamic-sql

我正在尝试从给定位置提取XML文件,但是我将在C#中获取该特定位置,并且需要将其传递给sql脚本。

这是我当前代码的片段:

CREATE TABLE XMLwithOpenXML
(
Id INT IDENTITY PRIMARY KEY,
XMLData XML,
LoadedDateTime DATETIME
)

DECLARE @filePath nvarchar(256) 

INSERT INTO XMLwithOpenXML(XMLData, LoadedDateTime)
SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE() 
FROM OPENROWSET(BULK 'C:\BimlFlex\BimlFlex.DatabaseContents.xml', SINGLE_BLOB) AS x;

显然我想用@filepath(或者?)替换硬编码路径,但是当我这样做时它表示它需要一个字符串或一个text_lex。

然后在c#中我希望做类似的事情:

using (var cmd = new SqlCommand(...))
{
   cmd.Parameters.Add(new SqlServerParameter(0, "actual path from unzipping");

编辑:我将使用动态SQL作为openrowset部分,如下所示:

DECLARE @OpenRowSetSql nvarchar(MAX)

SET @OpenRowSetSql =
'INSERT INTO XMLwithOpenXML(XMLData, LoadedDateTime)
SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE()
FROM OPENROWSET(BULK '''+ @filePath + ''', SINGLE_BLOB) AS x;'

EXEC sp_executesql @OpenRowSetSql

现在我的问题是:  如何在C#中加载参数?

1 个答案:

答案 0 :(得分:1)

好的,所以我想出了我的答案。

如果您正在使用SqlConnection,那么您需要将变量名称作为参数传递,因此它将是:

cmd.Parameters.Add(new SqlServerParameter("@filePath", "actual path from unzipping");

然而在OleDbConnection中,你需要做类似

的事情
DECLARE @filePath nvarchar(256) 
SET @filePath = ?

在sql ...然后

 cmd.Parameters.Add(new OleDbParameter("0", "actual path from unzipping");

其中0对应于数字变量(由“?”表示),它是从顶部开始(从0开始)。