首页 > 解决方案 > SQL - 在需要字符串的地方使用参数

问题描述

我在一个过程中有一个参数,它允许用户包含要使用的 JSON 文件的文件位置。我的问题是,SQL 不允许我使用参数,给我错误:

无法批量加载。文件“@JSONFileLocation”不存在。

并且在尝试删除“”时,错误:

期待 STRING 或 TEXT_LEX。

这是完整的程序:

ALTER PROCEDURE main.mainRun @JSONFileLocation NVARCHAR(MAX)
AS
    BEGIN TRY

DECLARE @Details NVARCHAR(MAX)

SELECT @Details = 
    BulkColumn
    FROM OPENROWSET(BULK @JSONFileLocation ,SINGLE_CLOB) JSON

    INSERT INTO main.jsontable (dateloaded,name,surname,email,age,balance,country,registered)
    (SELECT GETDATE(), [Name],[Surname],[Email],[Age],[Balance],[Country],[Registered]
    FROM OPENJSON(@Details,'$.PersonDetails.Person')        
    WITH(
        [Name] NVARCHAR(50)         '$.first_name',
        [Surname] NVARCHAR(50)      '$.last_name',
        [Email] NVARCHAR(50)        '$.email',
        [Age] NVARCHAR(50)          '$.age',
        [Balance] NVARCHAR(50)      '$.balance',
        [Country] NVARCHAR(50)      '$.country',
        [Registered] NVARCHAR(50)   '$.registered'
        )
    )

    EXEC main.generateStatistics

    END TRY
    BEGIN CATCH  
    SELECT  
        CONCAT('Error Number:',ERROR_NUMBER(),'|Error Message:',ERROR_MESSAGE(),'|Error Procedure:',ERROR_PROCEDURE()) AS 'Error'
    END CATCH;  

标签: sql-servertsql

解决方案


问题在于您的 OPENROWSET 查询。您需要使用 Dynamic Sql 将 Path 作为参数传递给 OPENROWSET。就像是...

ALTER PROCEDURE main.mainRun 
    @JSONFileLocation NVARCHAR(MAX)
AS
BEGIN
    BEGIN TRY

    DECLARE   @Details  NVARCHAR(MAX)
            , @Sql      NVARCHAR(MAX);

    SET @Sql = N' SELECT @Details = BulkColumn
                  FROM OPENROWSET(BULK ''' + @JSONFileLocation + ''',SINGLE_CLOB) JSON;';

    Exec sp_executesql @Sql
                      , N'@Details  NVARCHAR(MAX) OUTPUT'
                      , @Details OUTPUT;

    INSERT INTO main.jsontable
                       (dateloaded,name,surname,email,age,balance,country,registered)
    SELECT GETDATE(), [Name],[Surname],[Email],[Age],[Balance],[Country],[Registered]
    FROM OPENJSON(@Details,'$.PersonDetails.Person')        
    WITH(
        [Name]      NVARCHAR(50)    '$.first_name',
        [Surname]   NVARCHAR(50)    '$.last_name',
        [Email]     NVARCHAR(50)    '$.email',
        [Age]       NVARCHAR(50)    '$.age',
        [Balance]   NVARCHAR(50)    '$.balance',
        [Country]   NVARCHAR(50)    '$.country',
        [Registered] NVARCHAR(50)   '$.registered'
        )

    EXEC main.generateStatistics;

    END TRY
    BEGIN CATCH  
    SELECT  
        CONCAT  ('Error Number:',ERROR_NUMBER()
                ,'|Error Message:',ERROR_MESSAGE()
                ,'|Error Procedure:',ERROR_PROCEDURE()) AS 'Error'
    END CATCH

END

推荐阅读