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

问题描述 投票:1回答:1

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

我正在尝试动态构造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 sql-server json tsql stored-procedures
1个回答
3
投票

我没有测试这个例子,因为我有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')
© www.soinside.com 2019 - 2024. All rights reserved.