我在存储过程中有一个动态查询(我在存储过程中传递参数),该查询导致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)之后执行任何操作以将结果转换为变量吗?
谢谢..
答案 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一样,这是一个很大的问题,而原始字符串连接是一个可怕的想法,随时待开发。