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

时间:2017-06-02 09:20:30

标签: sql sql-server json tsql stored-procedures

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

我正在尝试动态构造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参数?

1 个答案:

答案 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')