Sql server 使用SQL OpenRowSet BulkColumn从.txt文件插入数据
我想执行OpenRowSet命令将.txt文件的内容拉入1列。在我的脚本中,我需要遍历现有记录的集合,并为要导入数据库的每个.txt文件构建一个动态文件路径,因此,我使用sp_executesql过程来执行OpenRowSet命令,并将.txt文件的内容输出到输出参数 我已经使用硬编码文件路径测试了OpenRowSet,并且没有将其传递给sp_executesql过程,我能够检索.txt文件内容并将其插入到SQL中所需的表中。所有这些都在起作用。我在sp_executesql过程中遇到的问题是输出参数返回为空。下面是我在Windows Server 2019上运行的MSSQL SMS版本15.0.18206.0的代码片段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过程中遇到的问题是输
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;'