2016-08-09 24 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 
查詢列中的值只是樣本。在生產中它們將是更復雜的查詢,但它們總是返回一個結果。

是否可以編寫一個查詢,像這樣的輸出:

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

是使用CASE ..

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

使用while循環遍歷每個ID,爲每個迭代獲取「query」,將其分配給nvarchar(max)變量,然後創建臨時表#temp(value varchar(max)),然後運行「INSERT INTO #temp EXEC(@query),然後從#temp獲取值並最終更新你的表。

請注意,您可能需要先更新您的表格,以便將適當的轉換包括到VARCHAR數據類型中。

相關問題