在存储过程中使用动态 SQL 进行批量插入
Using Dynamic SQL for a Bulk Insert in a Stored Procedure
我有一个 .NET 应用程序,我正在从中调用 2 个存储过程。这些存储过程之一是批量插入,我将向其传递适当的文件名、table 名称和来自 .NET 应用程序的分隔符。经过一些研究,我发现我需要使用动态 SQL 来允许 BULK INSERT
中的可变文件名。
我现在的代码是:
CREATE PROCEDURE transfer_data
@file_path VARCHAR, @t_name VARCHAR, @delimeter VARCHAR
AS
BULK INSERT @t_name
FROM @file_path
WITH (
FIELDTERMINATOR = @delimeter,
ROWTERMINATOR = '\n'
);
我该如何重构它?我看到的其他示例 (BULK INSERT with variable file name) 仍在查询中设置变量,但是我将从我的 .NET 应用程序传递参数。
您需要安全地注入值。您不能用变量替换文字。由于文件路径有可能超过 128 个字符,我使用 REPLACE
而不是 QUOTENAME
。我还假设分隔符的长度只有 1 个字符:
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);
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' ROWTERMINATOR = ''\n'');'
--PRINT @SQL;
EXEC sys.sp_executesql @SQL;
END;
我有一个 .NET 应用程序,我正在从中调用 2 个存储过程。这些存储过程之一是批量插入,我将向其传递适当的文件名、table 名称和来自 .NET 应用程序的分隔符。经过一些研究,我发现我需要使用动态 SQL 来允许 BULK INSERT
中的可变文件名。
我现在的代码是:
CREATE PROCEDURE transfer_data
@file_path VARCHAR, @t_name VARCHAR, @delimeter VARCHAR
AS
BULK INSERT @t_name
FROM @file_path
WITH (
FIELDTERMINATOR = @delimeter,
ROWTERMINATOR = '\n'
);
我该如何重构它?我看到的其他示例 (BULK INSERT with variable file name) 仍在查询中设置变量,但是我将从我的 .NET 应用程序传递参数。
您需要安全地注入值。您不能用变量替换文字。由于文件路径有可能超过 128 个字符,我使用 REPLACE
而不是 QUOTENAME
。我还假设分隔符的长度只有 1 个字符:
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);
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' ROWTERMINATOR = ''\n'');'
--PRINT @SQL;
EXEC sys.sp_executesql @SQL;
END;