Sql server SQL Server-使用JSON返回列名

Sql server SQL Server-使用JSON返回列名,sql-server,json,tsql,sql-server-2016,Sql Server,Json,Tsql,Sql Server 2016,我有下面的测试查询,我需要进行动态查询 基本上,存储过程将通过@json传递,它需要返回在该变量中传递的列名 这可能吗?我该怎么做 declare @json varchar(max) set @json = '["FirstName", "LastName","DOB"]'; select * from OPENJSON( @json ) select FirstName, LastName, DOB from Client 我确实有这样的方法,但不确定这是否是一个好的选

我有下面的测试查询,我需要进行动态查询

基本上,存储过程将通过@json传递,它需要返回在该变量中传递的列名

这可能吗?我该怎么做

declare @json varchar(max)

set @json = '["FirstName", "LastName","DOB"]';  

select *   
from OPENJSON( @json )  

select
FirstName,
LastName,
DOB
from Client
我确实有这样的方法,但不确定这是否是一个好的选择,是否有更好的方法

declare @json varchar(max)
declare @columnames varchar (200)
declare @sqlquery nvarchar(200)

set @json = '["FirstName", "LastName","DOB"]';  
set @columnames =''

select @columnames = 
    case when @columnames = ''
    then value
    else @columnames + coalesce(',' + value, '')
    end
  from OPENJSON( @json )  

set  @sqlquery = 'select ' + @columnames + ' from Client'

EXEC SP_EXECUTESQL @sqlquery
基本上,@json变量可以包含以下一个或多个或所有字段,随着时间的推移,甚至更多

set @json = '["FirstName", "LastName","DOB","DrugName,"Age","AgeGroup","Overdose","VerificationCode","Gender"]'; 
在这种情况下(您的json字符串只包含带有列名的标题),并且仅用于列选择,因此非常简单。如果您也希望从json字符串中获取值,那么就更难了

变体1:使用系统表验证输入并获取列名

declare @json varchar(800) = '["FirstName", "LastName", "DOB","DrugName,"Age","AgeGroup", "Overdose","VerificationCode","Gender"]',
@columnames varchar(800)

select @columnames = isnull(@sql + ', ', name) + name
from (
    select name, '"' + name + '"' name_quoted
    from sys.columns c
    where object_id('dbo.Client') = object_id) t
where @json like '%' + name_quoted + '%'

print @columnames
exec ('select ' + @columnames + ' from dbo.Client')
变体2:处理字符串

declare @json varchar(800) = '["FirstName", "LastName","DOB","DrugName,"Age","AgeGroup","Overdose","VerificationCode","Gender"]';
declare @sql varchar(max) = replace(substring(@json, 2, len(@json) - 2), '"','')
print @sql
exec ('select ' + @sql + ' from dbo.Client')

最好的方法是在应用程序中解析数据。sqlserver上的最佳实践是使用反序列化创建CLR TVL函数-此函数是非确定性的,您必须在应用程序中使用通用代码。在这个json示例字符串中,您可以使用字符串,但可以使用更复杂的字符串,包括转义字符。结论-解析应用程序中的数据。第二个选项-使用标量CLR到xml的序列化,并在sqlserver上使用xquery。示例:哇,这是一些复杂的东西@Deadsheep39。我之所以需要这样做,是因为我正在构建一个自定义报告,前端用户需要能够选择他们希望在报告中返回的列。我不知道它必须像@Deadshepp39所暗示的那样复杂。当然,我还建议在应用程序端进行解析。即返回所有列并决定在应用程序端显示什么。动态SQL(特别是SQL注入)有更多的数据流量,但出错的机会更少。您拥有的动态SQL是解决此问题的唯一解决方案,但您对它的怀疑是正确的。最好避免。SQL Server在知道始终返回哪些列时工作得最好。感谢您的想法@Nick.McDermaid何时说在应用程序端传递您指的是什么,因为我不确定将传递到存储过程的是什么?根据您的示例:您的应用程序运行
SELECT field1,field2,表中的字段3(即每个字段)。然后在应用程序内部,它决定(根据用户选择)实际显示的内容。这就是我所说的解析。这可能比你解释的还要多。