2016-08-09 5 views
1

テーブルの列に格納されているクエリを実行するには、いくつかの助けが必要です。テーブルの列にクエリを実行する

私のテーブル名はStatsです。

id  | key  | query 
------ | ------ | ------ 
1  | reportA | select 1 
2  | reportB | select 2 
3  | reportC | select count(id) from Users 
4  | reportD | select top 1 firstname from Users order by 1 desc 
クエリ列の値は単なるサンプルに過ぎません。プロダクションではより複雑なクエリになりますが、常に1つの結果が返されます。

は、このような出力でクエリを記述することが可能です..

key  | result | 
------ | ------ | 
reportA | 1  | 
reportB | 2  | 
reportC | 500 | 
reportD | Jack | 

答えて

2
あなたはこのような動的なクエリ何か使用して、それを試すことができます

-

DECLARE @temp table ([key] [varchar](100), [query] [varchar](1000)); 

INSERT @temp ([key], [query]) VALUES ('reportA', 'select 1'); 
INSERT @temp ([key], [query]) VALUES ('reportC', 'select count(id) from Users'); 
INSERT @temp ([key], [query]) VALUES ('reportA', 'select top 1 firstname from Users order by 1 desc'); 

DECLARE @qry varchar(max) = '' 

Select @qry += 'SELECT ' + QUOTENAME([key], '''') 
      + ' AS Yourkey, CAST((' + [query] + ') AS VARCHAR) AS Result UNION ALL ' 
From @temp 

SET @qry = LEFT(@qry, LEN(@qry) - 10) 

PRINT(@qry) 
EXEC(@qry) 

結果

Yourkey Result 
------------------- 
reportA 1 
reportC 500 
+0

ご協力ありがとうございます。それはうまくいくように見えます。ただ一つの問題。 "varchar値 'Jack'をデータ型intに変換するときに変換に失敗しました。すべての結果をvarcharのようなものに変換する必要がありますか? @ krishnraj-rana –

+0

私はこのようなクエリを更新しました: 'cast(( '+ [query] +')as varchar)AS result'。したがって、すべての結果をvarcharにキャストします。そして、問題は解決されます。 Thxそんなに。 –

+0

@İsaBasan:そうですね、そうすることもできます。あなたを助けてうれしい。 –

0

はいユースケース

Select 
case 
when key='reporta' then replace(query,'select','') 
when key='reportb' then replace(query,'select','') 
when key='reportc' then cast((select count(id) from users) as varchar(100)) 
when key='reportd' then (select top 1 firstname from Users order by 1 desc) 
End 
from yourtable 
+0

:)お返事ありがとうございます。それは巧みではあるが、十分に動的ではない。 –

0

ループを使用して各IDを確認し、各繰り返しに対して「クエリ」を取得し、変数nvarchar(max)に割り当ててからテンポラリテーブル#temp(value varchar(max))を作成し、INSERT INTO #temp EXEC(@query)、#tempから値を取得して、最後にテーブルを更新します。

VARCHARデータ型への適切な変換を含めるには、最初に表を更新する必要があります。

関連する問題