我有一个包含以下示例数据的文件:
|"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 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工具。