Массовая вставка параметризованного хранимого про c SQL 15 - PullRequest
0 голосов
/ 25 февраля 2020

Я уверен, что упускаю что-то глупое, но я не могу понять это через много часов.

Создан сохраненный профессионал c в 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

Сохраненный pro c создан без ошибок. Тем не менее, выполнение с использованием

EXEC BulkLoad N'C:\Temp\Data.txt',5

Я получаю сообщение об ошибке: Неверный синтаксис рядом с'@a'.

Любая помощь или указатель в правильном направлении будет принята с благодарностью.

ура, Джин

1 Ответ

0 голосов
/ 25 февраля 2020
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
...