SQL Server连接动态查询的JSON

时间:2019-01-15 09:35:00

标签: sql-server

我在存储过程中有一个动态查询(我在存储过程中传递参数),该查询导致JSON字符串。与此类似:

@PropertyPK uniqueidentifier (Stored Procedure Parameter)
@search_term Varchar(50)
@limit int
@offset int
Declare @test Varchar(1000)
SELECT @test = '
SELECT Cast((
SELECT *
FROM Contacts
Where Address like ''%' + @search_term + '%''' + ' Order By ' 
+ @sort_by + ' ' + @sort_order + ' OFFSET ' 
+ Cast(@offset as varchar) + 
' ROWS
FETCH NEXT ' 
+ Cast(@limit as varchar) + 
' ROWS ONLY 
For JSON Path, INCLUDE_NULL_VALUES )
as varchar(max))'
EXEC(@test)

我被要求以JSON格式但以一个字符串返回2个查询的结果。基本上将一个查询运行到一个变量中,然后将第二个查询运行到另一个中,并将它们连接在一起,然后交付结果。.有人可以帮我将上述查询的结果JSON放入变量中,以便对第二个查询执行相同的操作并将其连接他们?我可以在Exec(@test)之后执行任何操作以将结果转换为变量吗?

谢谢..

1 个答案:

答案 0 :(得分:0)

您发布的最新查询也不是动态的,因此我不确定您为什么使用EXEC。因此,正如我在评论中提到的那样,这就像使用SET一样简单:

DECLARE @PropertyPK uniqueidentifier; --SP parameter

DECLARE @JSON nvarchar(MAX);

SET @JSON = (SELECT *
             FROM Contacts
             WHERE PropertyPK = @PropertyPK
             FOR JSON PATH, INCLUDE_NULL_VALUES);

无需将@PropertyPK转换为varchar到动态SQL语句;只需使用适当的参数化SQL。

这基于猜测和OP的最新(但显然不完整)问题。如果这是不正确的,那么这应该可以使您走上正确的道路,但是,信息滴灌使问题难以正确回答。

DECLARE @PropertyPK uniqueidentifier,
        @SearchTerm varchar(50),
        @Limit int,
        @Offset int,
        @SortBy sysname,  --objects have the data type sysname, aka nvarchar(128)
        @SortOrder nvarchar(4); --Guess datatype as it was missing in your sample

DECLARE @JSON nvarchar(MAX);

DECLARE @SQL nvarchar(MAX);


SET @SQL = N'SET @JSON = (SELECT {Columns}' + NCHAR(10) + --Replace {Columns} with an actual list of the required columns (NOT *)
           N'             FROM dbo.Contacts' + NCHAR(10) +
           N'             WHERE Address LIKE @Search' + NCHAR(10) +
           N'               AND PropertyPK = @PropertyPK' + NCHAR(10) + --I ASSUME that WHERE is still needed
           N'             ORDER BY ' + QUOTENAME(@SortBy) + N' ' + CASE @SortOrder WHEN N'ASC' THEN N'ASC' WHEN N'DESC' THEN 'DESC' END + NCHAR(10) + --The CASE stops invalid sort orders
           N'             OFFSET @Offset FEETCH NEXT @Limit ROWS ONLY' + NCHAR(10) +
           N'             FOR JSON PATH, INCLUDE_NULL_VALUES);';

PRINT @SQL; --Your best friend
EXEC sp_executesql @SQL,
                   N'@JSON nvarchar(MAX) OUTPUT, @Search varchar(50), @PropertyPK uniqueidentifier, @Offset int, @Limit int',
                   @JSON = @JSON OUTPUT, 
                   @Search = @SearchTerm,
                   @PropertyPK = @PropertyPK,
                   @Offset = @Offset,
                   @Limit = @Limit;

您在这里需要注意的最大的事情之一就是我已经编写了SQL SAFE 。您的SQL可以接受SQL注入,这是一个巨大的安全漏洞。如果您不了解/不了解SQL注入,建议立即阅读。像上面的SQL一样,这是一个很大的问题,而原始字符串连接是一个可怕的想法,随时待开发。