繁体   English   中英

在存储过程中使用动态 SQL 进行大容量插入

[英]Using Dynamic SQL for a Bulk Insert in a Stored Procedure

我有一个 .NET 应用程序,我从中调用了 2 个存储过程。 这些存储过程之一是批量插入,我将从 .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 )仍在查询中设置变量,但是我将从我的 .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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM