【发布时间】: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 应用程序传递参数。
【问题讨论】:
-
您不能用变量替换文字。您必须安全地注入值,并且需要长度超过 1 个字符的变量。
-
您指的是变量@delmeter,对吗?在这种情况下,我将为分隔符所需的不同情况创建一个单独的存储过程。另外,我相信我正在安全地注入值,我在我的 .NET 应用程序中使用 SqlCommand 和 SqlParameter
-
@fragElephant,Larnu 指的是存储过程中的参数声明。所有参数都声明为
VARCHAR(n),没有(n)的值。 When n isn't specified in a data definition or variable declaration statement, the default length is 1. If n isn't specified when using the CAST and CONVERT functions, the default length is 30.所以你所有的参数目前都限制在一个字节内。
标签: sql sql-server stored-procedures bulkinsert