sql-server - 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;
解决方案
问题在于您的 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
推荐阅读
- excel - Next without For Error, If Else 语句
- google-chrome - Chrome window.open 显示失败 - 网络错误
- c# - 更改场景时如何使用 UnitySingleton 保存 int 值?
- powershell - 使用 Powershell 和 Visual Studio 2019 查询 TFS 2015 源代码存储库
- html - 在 MacOS 上,Chrome 在解锁屏幕后会获得焦点,即使另一个应用程序已获得焦点
- javascript - 如何在javascript中将Json字符串附加到另一个Json字符串
- javascript - 第一个页面打开为空而不加载数据
- google-apps-script - 如何使用谷歌 api 脚本获取谷歌文档的编辑器?
- cppyy - 基于方法参数的 Cppy 排除?
- plsql - 触发器中的标识符无效