Sql server SQL-在需要字符串的地方使用参数
我在一个过程中有一个参数,它允许用户包含要使用的JSON文件的文件位置。我的问题是,SQL不允许我使用参数,这给了我一个错误: 无法批量加载。文件“@JSONFileLocation”不存在 此外,在尝试删除“”时,还会出现以下错误: 应为字符串或文本 以下是完整的程序: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
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代码>