我正在使用 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
)
您使用了错误的语法。像这样执行动态生成的语句:
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 ... '