带有管道分隔文件的批量插入

问题描述 投票:0回答:1

我有一个包含以下示例数据的文件:

|"WP504"|"WMU"|"ACAOkt"|""|"53"|"345"|

和一个如下所示的大容量插入命令:

CREATE PROCEDURE dbo.transfer_data @file_path nvarchar(255), @s_name sysname = N'dbo', @t_name sysname, @delimiter nchar(1) AS
BEGIN

    DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10),
        @SQL2 nvarchar(50);

    SET @SQL = N'BULK INSERT ' + QUOTENAME(@s_name) + N'.' + QUOTENAME(@t_name) + @CRLF +
               N'FROM N''' + REPLACE(@file_path,'''','''''') + N'''' + @CRLF +
               N'WITH (FIELDTERMINATOR = N' + QUOTENAME(@delimiter,'''') + N',' + @CRLF +
               N'      BATCHSIZE = ' + '600' + N',' + @CRLF +
               N'      KEEPNULLS' +  N',' + @CRLF +
               N'      FIRSTROW = ' + '2' + N',' + @CRLF +
               N'      ROWTERMINATOR = ''\n'');'

    EXEC sys.sp_executesql @SQL;
END

有什么方法可以去除双引号(“”)的数据?理想情况下,我希望数字以小数形式存储

sql-server bulkinsert
1个回答
0
投票

如果使用的是SQL Server 2017+,则可以使用FORMAT选项:

CREATE PROCEDURE dbo.transfer_data @file_path nvarchar(255), @s_name sysname = N'dbo', @t_name sysname, @delimiter nchar(1) AS
BEGIN

    DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10),
        @SQL2 nvarchar(50);

    SET @SQL = N'BULK INSERT ' + QUOTENAME(@s_name) + N'.' + QUOTENAME(@t_name) + @CRLF +
               N'FROM N''' + REPLACE(@file_path,'''','''''') + N'''' + @CRLF +
               N'WITH (FIELDTERMINATOR = N' + QUOTENAME(@delimiter,'''') + N',' + @CRLF +
               N'      BATCHSIZE = ' + '600' + N',' + @CRLF +
               N'      KEEPNULLS' +  N',' + @CRLF +
               N'      FORMAT = ''CSV'',' + @CRLF +
               --N'      FIELDQUOTE = ''"'',' + @CRLF + --This probably isn't needed
               N'      FIRSTROW = ' + '2' + N',' + @CRLF +
               N'      ROWTERMINATOR = ''\n'');'

    EXEC sys.sp_executesql @SQL;
END

如果使用的是2016年或更早版本,则SQL Server不支持带引号的字符串。您可能需要注释引号来标识CSV文件中的字符串(并确保使用字符串中没有的定界符),或使用其他ETL工具。

© www.soinside.com 2019 - 2024. All rights reserved.