Sql server 使用SQL OpenRowSet BulkColumn从.txt文件插入数据

Sql server 使用SQL OpenRowSet BulkColumn从.txt文件插入数据,sql-server,tsql,Sql Server,Tsql,我想执行OpenRowSet命令将.txt文件的内容拉入1列。在我的脚本中,我需要遍历现有记录的集合,并为要导入数据库的每个.txt文件构建一个动态文件路径,因此,我使用sp_executesql过程来执行OpenRowSet命令,并将.txt文件的内容输出到输出参数 我已经使用硬编码文件路径测试了OpenRowSet,并且没有将其传递给sp_executesql过程,我能够检索.txt文件内容并将其插入到SQL中所需的表中。所有这些都在起作用。我在sp_executesql过程中遇到的问题是输

我想执行OpenRowSet命令将.txt文件的内容拉入1列。在我的脚本中,我需要遍历现有记录的集合,并为要导入数据库的每个.txt文件构建一个动态文件路径,因此,我使用sp_executesql过程来执行OpenRowSet命令,并将.txt文件的内容输出到输出参数

我已经使用硬编码文件路径测试了OpenRowSet,并且没有将其传递给sp_executesql过程,我能够检索.txt文件内容并将其插入到SQL中所需的表中。所有这些都在起作用。我在sp_executesql过程中遇到的问题是输出参数返回为空。下面是我在Windows Server 2019上运行的MSSQL SMS版本15.0.18206.0的代码片段

DECLARE     @rootDirectory          VARCHAR(100)
DECLARE     @filePathWithName       VARCHAR(255)
DECLARE     @txtFileContents        VARCHAR(MAX)
DECLARE     @commandText            NVARCHAR(MAX)

Set @commandText = N'(Select BulkColumn FROM OPENROWSET (BULK '''+ @rootDirectory + @filePathWithName + ''', SINGLE_CLOB) Myfile)'

-- Print the command text, should contain full text file path.
print 'Command Text: ' + @commandText

-- Execute command and output text file contents.
EXEC sp_executesql @commandText, 
                   N'@fileContentsOut VARCHAR(MAX) OUTPUT', 
                   @fileContentsOut = @txtFileContents OUTPUT;

-- Select the file contents output.
SELECT @txtFileContents;  -- <-- comes back empty???
我不明白为什么当我选择@txtfileContents时,它会返回为空。

试试这个:

DECLARE @txtFileContents VARCHAR(MAX);

SELECT @txtFileContents = BulkColumn
FROM OPENROWSET ( BULK 'F:\Assets\mypath\myfile12345.TXT', SINGLE_CLOB ) AS x;

SELECT @txtFileContents AS TxtFileContents;
更新:

我正在遍历一个记录列表,并在每次遍历时构建一个动态文件路径

这对我很有用:

DECLARE 
    @cmd nvarchar(1000),
    @file nvarchar(255) = 'F:\Assets\mypath\myfile12345.TXT',
    @txtFileContents varchar(MAX);

SET @cmd = FORMATMESSAGE ( 'SELECT @txtFileContents = BulkColumn FROM OPENROWSET ( BULK ''%s'', SINGLE_CLOB ) AS x;', @file );
EXEC sp_executesql @cmd, N'@txtFileContents varchar(MAX) OUT', @txtFileContents = @txtFileContents OUT;

SELECT @txtFileContents AS TxtFileContents;
原来您的
@commandText
中缺少
选择@fileContentsOut=BulkColumn

这:

需要:

SET @commandText = N'SELECT @fileContentsOut = BulkColumn FROM OPENROWSET (BULK '''+ @rootDirectory + @filePathWithName + ''', SINGLE_CLOB) Myfile;'

可以将SSI与for-each循环容器一起使用


严重错误,这就是我成功地使用硬编码文件路径所做的,但正如我所提到的,我正在迭代记录列表,每次都通过创建一个动态文件路径,并且此方法将不接受文件路径的参数。这就是我使用sp_executesql过程的原因。好吧,这是个麻烦。我会进一步挖掘的。是的,很简单,我做错了。只是不明白为什么输出参数返回为空。@GJGerson查看我答案的更新。“这对我有用。”格森说,你是对的。这是一个简单的问题,lol。这个链接被WebRoot标记,恶意软件字节已被感染!!!!!!!不要点击!!!!!!!!抱歉,刚刚用相同类型的教程更新了到其他站点的链接。
SET @commandText = N'SELECT BulkColumn FROM OPENROWSET (BULK '''+ @rootDirectory + @filePathWithName + ''', SINGLE_CLOB) Myfile;'
SET @commandText = N'SELECT @fileContentsOut = BulkColumn FROM OPENROWSET (BULK '''+ @rootDirectory + @filePathWithName + ''', SINGLE_CLOB) Myfile;'