2016-08-09 8 views
1

Ich benötige Hilfe zum Ausführen von Abfragen, die in einer Spalte einer Tabelle gespeichert sind.In einer Spalte einer Tabelle gespeicherte Abfragen ausführen

Mein Tabellenname ist Stats. Es enthält einige Berichtsabfragen wie folgt:

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 
Werte in Abfrage Spalte sind nur Beispiele. Sie werden in der Produktion komplexere Abfragen sein, aber sie geben immer ein Ergebnis zurück.

Ist es möglich, eine Abfrage mit einer Ausgabe wie folgt zu schreiben:

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

Antwort

2

Sie es dynamische Abfrage so etwas wie dies mit Hilfe versuchen können -

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) 

Ergebnis

+0

Danke für Ihre Hilfe. Es sieht so aus als würde es funktionieren. Nur ein Problem. "Die Konvertierung ist fehlgeschlagen, wenn der Varchar-Wert 'Jack' in den Datentyp int konvertiert wurde." Sollte ich alle Ergebnisse in etwas wie Varchar konvertieren? @ krishnraj-rana –

+0

Ich habe eine Abfrage wie folgt aktualisiert: 'cast (('+ [query] +') als varchar) AS result'. Also werden alle Ergebnisse nach varchar umgewandelt. Und das Problem ist gelöst. Vielen Dank. –

+0

@ IsaBasan: Richtig, du kannst das auch tun. Froh dir zu helfen. –

0

ja Verwendung 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

:) Danke für die Antwort. Es ist geschickt, aber nicht dynamisch genug. –

0

Verwenden Sie die While-Schleife, um jede ID zu durchlaufen, erhalten Sie "Abfrage" für jede Iteration, weisen Sie sie der Variable nvarchar (max) zu, dann erstellen Sie die temporäre Tabelle #temp (Wert varchar (max)) und führen Sie dann "INSERT" aus IN #temp EXEC (@query), dann den Wert von #temp holen und schließlich Ihre Tabelle aktualisieren.

Beachten Sie, dass Sie möglicherweise zuerst Ihre Tabelle aktualisieren müssen, um korrekte Konvertierungen in den VARCHAR-Datentyp zu integrieren.

Verwandte Themen