Sql server 大容量插入参数化存储过程SQL 15
我肯定会错过一些愚蠢的事情,但我似乎在很多小时后都无法理解 在SQL 15中创建了一个如下所示的存储过程:Sql server 大容量插入参数化存储过程SQL 15,sql-server,tsql,stored-procedures,bulkinsert,Sql Server,Tsql,Stored Procedures,Bulkinsert,我肯定会错过一些愚蠢的事情,但我似乎在很多小时后都无法理解 在SQL 15中创建了一个如下所示的存储过程: CREATE PROCEDURE [dbo].[BulkLoad] @BulkInsertFromFile varchar(255) = null, @MaxNumberOfFileErrors int = 0 AS BEGIN DECLARE @statement NVARCHAR(4000) DECLARE @parameterDefinition NVARCHAR
CREATE PROCEDURE [dbo].[BulkLoad]
@BulkInsertFromFile varchar(255) = null,
@MaxNumberOfFileErrors int = 0
AS
BEGIN
DECLARE @statement NVARCHAR(4000)
DECLARE @parameterDefinition NVARCHAR(4000)
SET @parameterDefinition = N'@a varchar, @b int, @c varchar, @d varchar, @e int'
SET @statement = '
BULK INSERT CombinedRawData
FROM @a
WITH (
FIRSTROW=@b,
FIELDTERMINATOR=@c,
ROWTERMINATOR=@d,
MAXERRORS=@e)'
EXECUTE sp_executesql @statement, @parameterDefinition, @BulkInsertFromFile, 2, ',', '\n', @MaxNumberOfFileErrors
创建存储过程时没有错误。但是,使用
EXEC BulkLoad N'C:\Temp\Data.txt',5
我收到错误消息:
“@a”附近的语法不正确
如能提供任何方向正确的帮助或指示,将不胜感激
干杯,
Gene创建过程[dbo].[BulkLoad]
@BulkInsertFromFile varchar(255)=null,
@MaxNumberOfFileErrors int=0
作为
开始
声明@statement NVARCHAR(4000)
声明@parameterDefinition NVARCHAR(4000)
--检查文件是否存在..最好使用xp\u fileexist以外的东西
声明@fileexists int;
exec xp_fileexist@BulkInsertFromFile,@fileexists输出;
如果isnull(@fileexists,0)1
开始
raiserror('文件不存在',16,1);
返回;
结束
选择@BulkInsertFromFile=replace(@BulkInsertFromFile,'');
声明@a varchar(5),
@b int=2,
@c varchar(5)=',',
@d varchar(5)='\n',
@e int=case当isnull(@MaxNumberOfFileErrors,0)时,您不需要创建字符串来执行接受参数的语句。创建该字符串也不会强制它们接受参数。如果来自
的不接受字符串外部的参数,它也不会接受该字符串内部的参数。为什么使用此存储过程而不是直接调用批量插入
?它所做的唯一一件事就是硬编码表名。你从哪里叫它?客户端代码?其他存储过程?谢谢你!您的代码不仅完成了这项工作,还提供了验证文件是否存在以及检查文件错误int是否为null的额外好处。非常感谢你简洁的回答。干杯,吉恩
CREATE PROCEDURE [dbo].[BulkLoad]
@BulkInsertFromFile varchar(255) = null,
@MaxNumberOfFileErrors int = 0
AS
BEGIN
DECLARE @statement NVARCHAR(4000)
DECLARE @parameterDefinition NVARCHAR(4000)
--check if file exists..better use something else than xp_fileexist
declare @fileexists int;
exec xp_fileexist @BulkInsertFromFile, @fileexists output;
if isnull(@fileexists, 0) <> 1
begin
raiserror('file does not exist', 16, 1);
return;
end
select @BulkInsertFromFile = replace(@BulkInsertFromFile, '''', '''''');
declare @a varchar(5),
@b int = 2,
@c varchar(5) = ',',
@d varchar(5) = '\n',
@e int = case when isnull(@MaxNumberOfFileErrors, 0) <= 0 then 0 else @MaxNumberOfFileErrors end;
SET @statement = N'
BULK INSERT CombinedRawData
FROM ''' + @BulkInsertFromFile + N'''
WITH (
FIRSTROW= ' + cast(@b as nvarchar(5)) + N',
FIELDTERMINATOR=''' + @c + N''',
ROWTERMINATOR=''' + @d + N''',
MAXERRORS=' + cast(@e as nvarchar(15)) + N'
)';
--print @statement
exec (@statement);
END