在存储过程中使用动态 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;