Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 大容量插入参数化存储过程SQL 15_Sql Server_Tsql_Stored Procedures_Bulkinsert - Fatal编程技术网

Sql server 大容量插入参数化存储过程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

我肯定会错过一些愚蠢的事情,但我似乎在很多小时后都无法理解

在SQL 15中创建了一个如下所示的存储过程:

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