SQL Server批量插入存储过程

问题描述 投票:0回答:1

我正在使用 SSMS 并尝试创建一个存储过程(因为它需要批量保存),因此我可以将多个 csv 文件(一次一个)批量插入到特定表中。

到目前为止我已经:

CREATE PROCEDURE AddDataToTable @TableName VARCHAR(25), @DataFolderPath VARCHAR(250),
@DataFile VARCHAR(50), @FieldDeterminator VARCHAR(10)
AS
BEGIN
DECLARE @SQL_BULK VARCHAR(MAX)
SET @SQL_BULK =
'BULK INSERT '+@TableName+'
FROM '''+@DataFolderPath+@DataFile+'''
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = '''+@FieldDeterminator+''',
ROWTERMINATOR = ''0x0A'',
TABLOCK
)'
PRINT @SQL_BULK
EXEC @SQL_BULK
END
GO

并与

一起使用
EXEC AddDataToTable 'dbo.People',@DataFolderPath,'\ImdbName.csv',';'

我收到错误:

消息 911,级别 16,状态 4,过程 AddDataToTable,第 18 行(批处理开始第 161 行)数据库“BULK INSERT dbo”不存在。确保名称输入正确。

问题是我还在程序中添加了一条打印语句,并且打印结果看起来应该包含每个引用,即:

BULK INSERT dbo.People
FROM 'C:\Users\PC\Desktop\Data\ImdbName.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ';',
ROWTERMINATOR = '0x0A',
TABLOCK
)
sql sql-server tsql stored-procedures bulkinsert
1个回答
2
投票

您使用了错误的语法。像这样执行动态生成的语句:

EXEC (@SQL_BULK)

DECLARE @err int
EXEC @err = sp_executesql @SQL_BULK
IF @err <> 0 PRINT 'Error found.'

作为补充说明,当您从输入字符串生成 SQL Server 标识符时,请始终使用

QUOTENAME()
来防止可能的 SQL 注入问题:

SET @SQL_BULK = 'BULK INSERT ' + QUOTENAME(@TableName) + ' FROM ... '
© www.soinside.com 2019 - 2024. All rights reserved.