使用带有参数化文件名的OpenRowSet

本文关键字:文件名 OpenRowSet 参数 | 更新日期: 2023-09-27 18:06:37

我正试图从给定位置提取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#中加载参数?

使用带有参数化文件名的OpenRowSet

好了,我找到答案了。

如果你使用的是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对应number变量(用"?"表示),它从顶部开始(从0开始)