2017-01-02 12 views
1

次のテストクエリがあります。動的にする必要があります。SQL Server - JSONを使用して列名を返す

ストアドプロシージャは基本的に@jsonに渡され、その変数に渡される列名を返す必要があります。

これは可能ですか?どうすればできますか?

私は、このことは動作しますが、それは良いオプションだとより良い方法

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変数は、1つまたは多くまたはすべてを含めることができるかどうかについてわからないを持っている

declare @json varchar(max) 

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

select * 
from OPENJSON(@json) 

select 
FirstName, 
LastName, 
DOB 
from Client 

フィールドの下で、さらに時間をかけて。

set @json = '["FirstName", "LastName","DOB","DrugName,"Age","AgeGroup","Overdose","VerificationCode","Gender"]'; 
+0

最も良い方法は、アプリケーションの解析データです。 sqlserverのベストプラクティスは、逆シリアル化を使用してCLR TVL関数を作成することです。この関数は非決定的で、アプリケーションで汎用コードを使用する必要があります。このjsonの例の文字列では、文字列の操作を使用できますが、エスケープ文字を含む複雑な文字列を使用することができます。結論 - アプリケーション内のデータを解析します。 2番目のオプション - xmlへスカラーCLRを使用してシリアル化を使用し、sqlserverでxqueryを使用します。例:http://www.sqlservercentral.com/articles/SQLCLR/74160/ – Deadsheep39

+0

うわー、それは@ Deadsheep39の複雑なものです。私がこれを行う必要があるのは、フロントエンドのユーザーがレポートで返す列を選択する必要がある場所に構築しているカスタムレポートだからです。 – Philip

+0

@ Deadshepp39が意味するように複雑でなければならないことはわかりません。確かに、アプリケーション側で解析することをお勧めします。それはすべての列を返し、アプリ側で何を表示するかを決定します。より多くのデータ・トラフィックがありますが、動的SQL(特にSQLインジェクション)では間違っています。あなたが持っている動的SQLはこれに対する唯一の解決策ですが、あなたはそれを疑うことは正しいです。それは避けるのが最善です。 SQL Serverは、常にどの列が返されているかを正確に把握している場合に最適です。 –

答えて

0

この場合(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') 
+0

Thanks @ Deadsheep39 - – Philip

関連する問題