Sql server SQL-在需要字符串的地方使用参数

Sql server SQL-在需要字符串的地方使用参数,sql-server,tsql,Sql Server,Tsql,我在一个过程中有一个参数,它允许用户包含要使用的JSON文件的文件位置。我的问题是,SQL不允许我使用参数,这给了我一个错误: 无法批量加载。文件“@JSONFileLocation”不存在 此外,在尝试删除“”时,还会出现以下错误: 应为字符串或文本 以下是完整的程序: ALTER PROCEDURE main.mainRun @JSONFileLocation NVARCHAR(MAX) AS BEGIN TRY DECLARE @Details NVARCHAR(MAX) SE

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

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

此外,在尝试删除“”时,还会出现以下错误:

应为字符串或文本

以下是完整的程序:

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;  

问题在于OPENROWSET查询。您需要使用动态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

嗯,我明白了,SP Execute到底是做什么的?这非常有效,谢谢!!我对XML的应用如下:
DECLARE@InXMLPath VARCHAR(250);声明@xmldataxml,@ORS NVARCHAR(MAX);SET@InXMLPath='C:\myxmlfile.xml';将@ORS=N'SELECT@xmlData=BulkColumn从OPENROWSET(BULK''+@InXMLPath+'',SINGLE_CLOB)设置为xmlData;';Exec sp_executesql@ORS,N'@xmlData XML OUTPUT',@xmlData OUTPUT