2012-04-07 19 views
0

Wie fügen Sie die Ausgabe eines SP in eine Tabelle ein, wenn das Ergebnis eine variable Anzahl von Spalten haben kann?Gespeicherte Prozedur zu einer Tabelle mit variabler Anzahl von Spalten

Dieser SP erstellt eine Tabelle, in der die Anzahl der Spalten variieren kann. Ich muss die Ergebnisse in eine temporäre Tabelle stellen, damit ich sie zum Abfragen von Berichten verwenden kann. Wie erstelle ich eine Tabelle, die mit der Ausgabe des SP umgehen kann?

DECLARE @cols AS VARCHAR(MAX), 
@query AS VARCHAR(MAX); 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.question) 
     FROM temp_SURVEY_DATA c 
     FOR XML PATH(''), TYPE 
     ).value('.', 'VARCHAR(MAX)') ,1,1,'') 

set @query = 'SELECT responseid, moduleid, responsedatetime, ' + @cols + ' from 
     (select question, response, responsedatetime, responseid, moduleid 
      from temp_SURVEY_DATA) x 
     pivot 
     (max(response) 
      for question IN(' + @cols + ')) p ' 

      execute(@query) 
+0

Und ** was ** Datenbank und welche Version ??? Diese Dinge sind meistens herstellerspezifisch ... –

+0

Ich benutze SQL 2005. Ich habe die OPENROWSET-Funktion gesehen und habe SQLNCLI als Providertyp verwendet, ich weiß nicht, ob das korrekt ist. Ich bin mir nicht sicher, wie ich es herausfinden soll. – Stan

Antwort

0

eine statische Tabelle Verwenden Sie die speziell für diese Art der Sache und legen Sie die Ergebnismenge in es anstelle der Rücksendung der Zeilen mit dem Anrufer gewidmet:

DECLARE @cols AS VARCHAR(MAX), 
     @query AS VARCHAR(MAX); 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.question) 
     FROM temp_SURVEY_DATA c 
     FOR XML PATH(''), TYPE 
     ).value('.', 'VARCHAR(MAX)') ,1,1,''); 

EXECUTE ('IF OBJECT_ID(''temp_SURVEY_DATA_pivoted'') IS NOT NULL DROP TABLE temp_SURVEY_DATA_pivoted'); 

set @query = 'SELECT responseid, moduleid, responsedatetime, ' + @cols + ' 
    INTO temp_SURVEY_DATA_pivoted 
    from 
     (select question, response, responsedatetime, responseid, moduleid 
      from temp_SURVEY_DATA) x 
     pivot 
     (max(response) 
      for question IN(' + @cols + ')) p ' 

      execute(@query) 

Oder verlassen die Idee der dynamischen Skript, wenn es wird an einer anderen Stelle als unmittelbar vor dem Anzeigen Ihrer Daten verwendet.

Verwandte Themen