Процедура SQL Server выдает ошибку параметра, хотя я ввел значение - PullRequest
0 голосов
/ 16 мая 2019

Я делаю процедуру, которая принимает входной параметр filepath, считывает из него данные json и вставляет данные в таблицу.Однако, когда я пытаюсь выполнить процедуру, я получаю эту ошибку:

Сообщение 201, Уровень 16, Состояние 4, Процедура main.loadData, Строка 0 [Стартовая строка 244]
Процедураили функция «loadData» ожидает параметр «@filePath», который не был предоставлен.

Удивительно, что я добавляю параметр ..

Код процедурыэто:

ALTER PROCEDURE main.loadData
    (@filePath VARCHAR(200))
AS
BEGIN
    DECLARE @pathScript AS VARCHAR(MAX)

    SET @pathScript='DECLARE @jsonVariable NVARCHAR(max);
                     SELECT @jsonVariable = BulkColumn
                     FROM OPENROWSET (BULK ''' + @filepath     
                                      + ''', SINGLE_CLOB) as j;

    INSERT INTO main.jsonData(restaurant, priceRange, country, score, reviewDate)
        SELECT *
        FROM OPENJSON(@jsonVariable, ''$.reviews.row'')
        WITH
            (restaurant VARCHAR(100) ''$.restaurant'',
             priceRange VARCHAR(50) ''$.priceRange'',
             country VARCHAR(50) ''$.country'',
             score INTEGER ''$.score'',
             reviewDate DATETIME ''$.reviewDate''
            );';

    EXEC(@pathScript);
END;
GO

И код выполнения таков:

EXEC main.loadData 'C:\data.json';

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Я нашел проблему. И это самая глупая проблема. Часть моей программы имеет триггер, который срабатывает после того, как эта процедура вставит данные в таблицу. Теперь, чтобы не вставлять несколько раз в одну и ту же таблицу (то есть, если вы выполняете 2 раза, вы получаете удвоенные данные), я добавил DELETE FROM main.jsonData, а затем EXEC main.loadData (который в то время не требовался параметры). Из-за этой строки выполнения, которая не давала параметр, это дало мне ошибку. Спасибо всем, кто помог!

0 голосов
/ 16 мая 2019

Попробуйте установить параметр в объявлении.

ALTER PROCEDURE main.loadData
    @filePath VARCHAR(200) NOT NULL
AS
BEGIN
    DECLARE @pathScript AS VARCHAR(MAX), @params VARCHAR(200);

    SET @params = @filepath VARCHAR(200);

    SET @pathScript='DECLARE @jsonVariable NVARCHAR(max);
                     SELECT @jsonVariable = BulkColumn
                     FROM OPENROWSET (BULK ''' + @params   
                                      + ''', SINGLE_CLOB) as j;

    INSERT INTO main.jsonData(restaurant, priceRange, country, score, reviewDate)
        SELECT *
        FROM OPENJSON(@jsonVariable, ''$.reviews.row'')
        WITH
            (restaurant VARCHAR(100) ''$.restaurant'',
             priceRange VARCHAR(50) ''$.priceRange'',
             country VARCHAR(50) ''$.country'',
             score INTEGER ''$.score'',
             reviewDate DATETIME ''$.reviewDate''
            );';

    EXEC(@pathScript);
END;
GO

И попробуйте выполнить вот так

EXEC main.loadData @filepath = 'C:\data.json'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...