【问题标题】:Use SQL OpenRowSet BulkColumn to Insert data from .txt File使用 SQL OpenRowSet BulkColumn 从 .txt 文件中插入数据
【发布时间】:2020-10-26 21:10:34
【问题描述】:

我想执行 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???

当我执行上面的命令时,我得到一个查询结果窗口,它在名为“BulkColumn”的列中显示 .txt 文件的内容,但 @txtFileContents 参数为空。

这是@commandText 在执行前的样子:

Command Text: (Select BulkColumn FROM OPENROWSET (BULK 'F:\Assets\mypath\myfile12345.TXT', SINGLE_CLOB) Myfile)

我不明白为什么当我选择 @txtfileContents 时它返回为空。

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    试试这个:

    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 中缺少SELECT @fileContentsOut = BulkColumn

    这个:

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

    【讨论】:

    • 严重错误,这就是我成功使用硬编码文件路径所做的事情,但正如我所提到的,我正在遍历记录列表并每次构建动态文件路径,并且此方法不接受文件路径的参数。这就是我使用 sp_executesql 过程的原因。
    • 好吧,这太糟糕了。我会进一步挖掘。
    • 是的,一定很简单,我做错了。只是无法弄清楚为什么输出参数返回为空。
    • @GJGerson 查看我的答案的更新。这对我有用。
    • @GJGerson 作为记录,你是对的。这是一个简单的问题,哈哈。
    【解决方案2】:

    【讨论】:

    • 此链接已被 WebRoot 标记,并且恶意软件字节已感染!!!!!!!!!不要点击!!!!!!!!!
    • 抱歉,刚刚更新了指向具有相同类型教程的不同站点的链接。
    猜你喜欢
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2019-04-21
    相关资源
    最近更新 更多