【问题标题】:Using Dynamic SQL for a Bulk Insert in a Stored Procedure在存储过程中使用动态 SQL 进行批量插入
【发布时间】:2020-03-31 13:24:53
【问题描述】:

我有一个 .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 with variable file name) 仍在查询中设置变量,但是我将从我的 .NET 应用程序传递参数。

【问题讨论】:

标签: sql sql-server stored-procedures bulkinsert


【解决方案1】:

您需要安全地注入这些值。您不能用变量替换文字。由于文件路径有可能超过 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;

【讨论】:

  • @CRLF 在做什么?
  • 回车,换行,@fragElephant .
猜你喜欢
  • 1970-01-01
  • 2011-05-02
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 2016-08-20
  • 1970-01-01
相关资源
最近更新 更多