是否可以使用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参数的主要内容,如果未能解决你的问题,请参考以下文章
MsSQL 未使用 sp_executesql 传递用户定义的表类型