次のテストクエリがあります。動的にする必要があります。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"]';
最も良い方法は、アプリケーションの解析データです。 sqlserverのベストプラクティスは、逆シリアル化を使用してCLR TVL関数を作成することです。この関数は非決定的で、アプリケーションで汎用コードを使用する必要があります。このjsonの例の文字列では、文字列の操作を使用できますが、エスケープ文字を含む複雑な文字列を使用することができます。結論 - アプリケーション内のデータを解析します。 2番目のオプション - xmlへスカラーCLRを使用してシリアル化を使用し、sqlserverでxqueryを使用します。例:http://www.sqlservercentral.com/articles/SQLCLR/74160/ – Deadsheep39
うわー、それは@ Deadsheep39の複雑なものです。私がこれを行う必要があるのは、フロントエンドのユーザーがレポートで返す列を選択する必要がある場所に構築しているカスタムレポートだからです。 – Philip
@ Deadshepp39が意味するように複雑でなければならないことはわかりません。確かに、アプリケーション側で解析することをお勧めします。それはすべての列を返し、アプリ側で何を表示するかを決定します。より多くのデータ・トラフィックがありますが、動的SQL(特にSQLインジェクション)では間違っています。あなたが持っている動的SQLはこれに対する唯一の解決策ですが、あなたはそれを疑うことは正しいです。それは避けるのが最善です。 SQL Serverは、常にどの列が返されているかを正確に把握している場合に最適です。 –