Как получить данные JSON из хранимой процедуры для тестирования с помощью tSQLt

Я пытаюсь использовать tSQLt для тестирования хранимой процедуры, которая возвращает данные JSON. База данных работает под управлением SQL Server 2016. Хранимая процедура выглядит следующим образом (значительно упрощена):

CREATE PROCEDURE [SearchForThings]
    @SearchText NVARCHAR(1000),
    @MaximumRowsToReturn INT
AS
BEGIN
    SELECT TOP(@MaximumRowsToReturn)
        [Id],
        [ItemName]
    FROM
        [BigTableOfThings] AS bt
    WHERE 
        bt.[Tags] LIKE N'%' + @SearchText + N'%'
    ORDER BY 
        bt.[ItemName]
    FOR JSON AUTO, ROOT(N'Things');
END;

Это нельзя проверить так же, как XML - я попробовал тестовую таблицу, как показано ниже, которая была предложена в этом связанном ответе здесь -

CREATE TABLE #JsonResult (JsonData NVARCHAR(MAX))

INSERT #JsonResult (JsonData) 
    EXEC [SearchForThings] 'cats',10

Приведенный выше код выдает эту ошибку:

Предложение FOR JSON не допускается в операторе INSERT.

Я не могу изменить тестируемую хранимую процедуру. Как я могу зафиксировать результат JSON?


person SWalters    schedule 15.12.2017    source источник
comment
Вы не можете выполнить select statement в SQL Server Management Studio и просмотреть результат?   -  person Clive Seebregts    schedule 15.12.2017
comment
@CliveSeebregts Можете ли вы пояснить, как это поможет протестировать эту хранимую процедуру в модульном тесте tSQLt?   -  person SWalters    schedule 15.12.2017
comment
Я неправильно понял, я думал, что вы ищете образец вывода запроса   -  person Clive Seebregts    schedule 15.12.2017


Ответы (2)


Не имея возможности изменить сохраненный процесс, вашей последней попыткой будет использовать OPENROWSET. Вот как бы вы назвали это в вашем случае:

INSERT INTO #JsonResult
SELECT *
FROM OPENROWSET('SQLNCLI', 'Server=[ServerNameGoesHere];Trusted_Connection=yes;','EXEC SearchForThings ''cats'',10')

Если вы получили сообщение об ошибке, вы можете использовать следующее, чтобы включить специальные распределенные запросы:

sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
person digital.aaron    schedule 19.12.2017
comment
Угх. Я боялся, что OPENROWSET окажется единственным вариантом. Попытка сделать это с учетной записью с наименьшими привилегиями сложна (мягко говоря) с точки зрения безопасности. Надеемся, что будущая версия SQL сделает работу с выводом JSON немного менее болезненной. - person SWalters; 20.12.2017

Я знаю, что прошло два года, но я наткнулся на это сегодня, пытаясь решить другую проблему tSQLt.

Ваша проблема возникает из-за того, что столбец, возвращаемый вашей хранимой процедурой, не имеет явного имени. Если вы укажете имя столбца для данных JSON, вы можете вставить данные в таблицу #temp, например:

create table BigTableOfThings (
    Id int not null,
    ItemName nvarchar(50) not null,
    Tags nvarchar(50) not null
);
insert BigTableOfThings values
    (1, 'Whiskers', 'Cool for Cats'),
    (2, 'Barkley', 'Dogs Rule!');
GO
create procedure SearchForThings
    @SearchText nvarchar(1000),
    @MaximumRowsToReturn int
as
begin
    select [JsonData] = (
        select top(@MaximumRowsToReturn)
            Id,
            ItemName
        from
            BigTableOfThings as bt
        where 
            bt.Tags like N'%' + @SearchText + N'%'
        order by
            bt.ItemName
        for json auto, root(N'Things')
    );
end
go
create table #JsonResult (JsonData nvarchar(max));
insert #JsonResult (JsonData) 
    exec SearchForThings 'cats',10;
select * from #JsonResult;
go

Который дает...

{"Things":[{"Id":1,"ItemName":"Whiskers"}]}
person AlwaysLearning    schedule 04.06.2020