是否可以使用sp_executesql将JSON作为out参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以使用sp_executesql将JSON作为out参数相关的知识,希望对你有一定的参考价值。

我正在编写一个存储过程来尝试跟踪不同表中对象的更改。

我正在尝试动态构造SQL,所以我被迫使用sp_executesql

到目前为止,我有:

SET @SQLInserted = 'Select * from ' + '[Diary.Day]' + ' Where Id=' + '13'+  ' for json path';
SET @SQLClash = 'Select * from ' + '[Diary.Day]' + ' Where Id=' + '12'+  ' for json path';

其中[Diary.Day][Id]是传递到存储过程的参数。

然后我可以使用sp_executesql来运行这个sql并显示一个JSON对象。

但我不想将该对象放入变量中以便能够将其插入表中。

到目前为止,我有:

DECLARE @jsonInserted NVARCHAR(MAX), @jsonClash NVARCHAR(MAX)

DECLARE @SQLInserted nvarchar(500),  @SQLClash nvarchar(500);
SET @SQLInserted = 'Select * from ' + '[Diary.Day]' + ' Where Id=' + '13'+  ' for json path';
SET @SQLClash = 'Select * from ' + '[Diary.Day]' + ' Where Id=' + '12'+  ' for json path';

exec sp_executesql @SQLInserted
exec sp_executesql @SQLClash

Insert Into [Log.Transaction] ([Table], [EntryTimeRaw], [OldObject], [NewObject], [Operation]) 
Values ('[Diary.Day]', 10000000, @jsonInserted, @jsonClash, 'CLASH')

但显然没有分配@jsonInserted@jsonClash变量,所以上面的SQL没有插入任何东西。

当使用sp_executesql或我做错了什么时,是否可以将JSON指定为out参数?

答案

我没有测试这个例子,因为我有SQL 2014.结果应该是这样的

DECLARE @jsonInserted NVARCHAR(MAX), @jsonClash NVARCHAR(MAX)

DECLARE @SQL NVARCHAR(500)
SET @SQL = N'SET @json = (SELECT * FROM [Diary.Day] WHERE Id = @Id FOR JSON PATH)';

EXEC sp_executesql @SQL, N'@id INT, @json NVARCHAR(MAX) OUTPUT', @id = 12, @json = @jsonInserted OUTPUT
EXEC sp_executesql @SQL, N'@id INT, @json NVARCHAR(MAX) OUTPUT', @id = 13, @json = @jsonClash OUTPUT

INSERT INTO [Log.Transaction] ([Table], [EntryTimeRaw], [OldObject], [NewObject], [Operation]) VALUES ('[Diary.Day]', 10000000, @jsonInserted, @jsonClash, 'CLASH')

以上是关于是否可以使用sp_executesql将JSON作为out参数的主要内容,如果未能解决你的问题,请参考以下文章

如何将 sp_executesql 结果转换为变量?

MsSQL 未使用 sp_executesql 传递用户定义的表类型

sp_executesql 使用

实体框架可以在不访问 sp_executesql 的情况下执行存储过程吗?

sp_executesql vs 用户定义的标量函数

用于打开文件的 SQL 用户定义函数