【问题标题】:SQL Server procedure throwing a parameter error even though I entered a value即使我输入了一个值,SQL Server 过程也会引发参数错误
【发布时间】:2019-05-16 16:33:34
【问题描述】:

我正在做一个程序,它接受文件路径的输入参数,从中读取 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';

【问题讨论】:

  • 你使用的是哪个数据库?
  • @AdnanSharif Microsoft SQL Server 管理工作室
  • 试试 EXEC main.loadData @filePath = 'C:\data.json';
  • @Brad 同样的错误。
  • @jms15 我不知道你面临的是哪种情况。但是上面的格式似乎还可以。这是working fiddle。

标签: sql-server file stored-procedures parameters


【解决方案1】:

尝试在声明中设置参数。

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'

【讨论】:

  • 感谢您的回复。我试过了,它给了我这个错误:无法批量加载。文件“@filepath VARCHAR(200) OUTPUT”不存在或您没有文件访问权限。
  • 我进行了编辑。我对出了什么问题的假设是;要么在开头设置@filepath 变量需要设置为NOT NULL 或占位符值,或者@pathScript 寻找@filepath 但两者之间没有声明链接您传递的原始路径。
  • 尝试更改文件位置,看看是否收到相同的错误消息。
  • @FaisalMehboob 我尝试更改位置,认为它也不起作用
【解决方案2】:

我发现了问题。这是最愚蠢的问题。我的程序的一部分有一个触发器,该触发器在此过程将数据插入表中后触发。现在,为了避免在同一张表上多次插入(意味着如果你执行 2 次,你会得到双倍的数据),我添加了一个 DELETE FROM main.jsonData,然后是 EXEC main.loadData(当时不需要任何参数)。由于这个没有给出参数的执行行,它给了我错误。感谢所有帮助过的人!

【讨论】:

    猜你喜欢
    • 2016-01-04
    • 1970-01-01
    • 2021-05-03
    • 2020-12-16
    • 1970-01-01
    • 2017-07-25
    • 2020-03-22
    • 1970-01-01
    • 2018-03-20
    相关资源
    最近更新 更多