#sql-server #tsql
#sql-сервер #tsql
Вопрос:
Как я могу сохранить результат exec в переменной? На выходе получается JSON. Мой SQL-запрос сложный и генерируется динамически, поэтому я должен установить переменную и выполнить ее.
create PROCEDURE dbo.RetrievePerfCounterData @jsonOutput NVARCHAR(MAX) OUTPUT
AS
BEGIN
declare @sql NVARCHAR(MAX)
SET @sql = ' SELECT TOP (1) getdate() AS ''dateTime'' ,suser_sname()AS ''user'' FOR JSON PATH '
exec (@sql)
END
Вот моя попытка сохранить данные в переменной:
DECLARE @json AS NVARCHAR(MAX)
EXEC dbo.RetrievePerfCounterData @jsonOutput = @json OUTPUT
Ответ №1:
DECLARE @myVar VARCHAR(MAX)
DECLARE @SQL NVARCHAR(MAX)
IF OBJECT_ID('tempdb..#t1') IS NOT NULL DROP TABLE #t1
CREATE TABLE #t1 (col1 INT, col2 INT)
INSERT INTO #t1
SELECT 1, 1
UNION
SELECT 1, 2
SET @SQL = 'SET @myVar = (SELECT * FROM #t1 AS T FOR JSON AUTO);'
EXEC sp_executesql @SQL, N'@myVar VARCHAR(MAX) OUT', @myVar OUT
SELECT @myVar
Комментарии:
1. Как это помогает операции здесь?
FOR JSON
не поддерживает установку значения переменной внутриSELECT
.2. Я отредактировал свой ответ в соответствии с вашим вопросом. вывод должен быть varchar, тогда вы можете использовать различные методы для преобразования строки json в табличные данные.
Ответ №2:
Вам нужно использовать подзапрос:
SET @json = (SELECT TOP (1) getdate() AS [dateTime],suser_sname()AS [user] FOR JSON PATH);