我正在编写一个存储过程来尝试跟踪不同表中对象的更改。
我正在尝试动态构造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参数?
答案 0 :(得分: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')