2016-10-05 12 views
0

Ich habe einen Parameter in der gespeicherten Prozedur namens Grouplist. Diese enthalten Spaltennamen in Komma getrennten Werten.Sql Zeichenfolge ersetzen Problem

für zB: @ grouplist = 'Class1, Class2, Class3'

Meine Frage ist

Set @ Sql = 'wählen' + @grouplist +‘von #final

Meine Ergebnis ist

Table result

Diese Spalten enthält Wert "ZZTotal" -Wert. Es sollte durch "Total" ersetzt werden. Dies sind dynamische Spalten.

Ich muss Zztotal mit insgesamt ersetzen.

In der letzten Ausgabe sollte es sein, diese

final output

jede Hilfe dankbar

+4

Ihre Frage fehlt jeden Kontext verständlich zu machen. Ich kann nicht davon erzählen, was du versuchst zu tun oder was das Problem ist. Du kannst hier anfangen. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

@Sean Lange Ich habe die Frage geändert – user1554650

+0

Nun, die Frage ist sicherlich anders Leider ist es nicht klarer als vorher. Ich wäre misstrauisch bei einer Abfrage mit dynamisch ausgewählten Spalten. Wenn Sie mit dynamic sql festgefahren sind, müssen Sie durch einige ernsthafte Hürden springen, um das durchzuziehen. Sie müssen hier eine Menge mehr Informationen zur Verfügung stellen. Sie werden wahrscheinlich einen String-Splitter benötigen, um Ihren dynamischen SQL-Server neu aufzubauen. –

Antwort

2

Es ist ein größeres Problem, das ignoriert wird: Es ist wahrscheinlich ein Grund dafür, dass der Text bereits ZZTotal anstelle von Total. Und dieser Grund ist höchstwahrscheinlich, um eine korrekte Reihenanordnung aufrechtzuerhalten (d. H. Die Summen unten zu halten). Die ZZTotal Zeilen werden höchstwahrscheinlich automatisch vom SQL Server über die ROLLUP Option der GROUP BY Klausel generiert. Anfangs platziert die ROLLUP Option NULL in jeder "Gruppe", die aufgerollt wird, da die Zeichenfolge "Total" (oder eine beliebige Zeichenfolge) nicht in eine Spalte von Nicht-String-Datentypen passt. Ich vermute, dass die Werte wurden mit ZZTotal über ISNULL() beim Ausgeben der Ergebnisse in #final ersetzt.

Das aktuelle Problem ist, dass, wenn Sie die ZZTotal Werte mit Total ersetzen, dann den „Total“ Zeilen werden möglicherweise nicht an der Unterseite dieser Gruppierung sein, zumindest nicht für alle Gruppierungen, die Strings mit U... beginnend enthalten oder Tp... oder Tou... und so weiter.

  1. Der erste Schritt ist es, eine IDENTITY Spalte zu der #final Tabelle hinzuzufügen. Dazu ändern Sie die Abfrage, die #final erstellt und auffüllt, indem Sie IDENTITY(INT, 1, 1) AS [RowNum], als erste Spalte der SELECT-Anweisung hinzufügen.

  2. Der zweite Schritt ist die ISNULL(column, 'ZZTotal') der Abfrage zu ändern, die #final auffüllt stattdessen sein (für Klasse 2, zum Beispiel):

    IIF(GROUPING(class2) = 0, class2, N'Total for ' + class1) AS [Class2] 
    

    Bitte beachten Sie die Verwendung von „Class1“, nicht „Klasse 2“ , am Ende von N'Total for ' + class1.

  3. Der dritte/letzte Schritt besteht darin, ORDER BY [RowNum] am Ende der Set @Sql= Anweisung hinzuzufügen.Die letzte Abfrage sollte etwas sein wie:

    SELECT Class1, Class2, Class3 FROM #final ORDER BY [RowNum]; 
    

Beispiel 1: ROLLUP- Standardverhalten

SELECT ss.[name] AS [SchemaName], 
     so.[type_desc] AS [ObjectType], 
     COUNT(*) AS [ObjectCount] 
FROM [master].sys.schemas ss 
INNER JOIN [master].sys.objects so 
     ON so.[schema_id] = ss.[schema_id] 
GROUP BY ss.[name], so.[type_desc] WITH ROLLUP; 

Beispiel 2: ROLLUP- mit NULL-Werte in der Gruppierungs Reihen ersetzt

SELECT IIF(GROUPING(ss.[name]) = 0, ss.[name], N'Total') AS [SchemaName], 
     IIF(GROUPING(so.[type_desc]) = 0, 
      so.[type_desc], 
      IIF(GROUPING(ss.[name]) = 0, 
       N'Total for ' COLLATE Latin1_General_CI_AS_KS_WS + ss.[name], 
       N'---------------------------------------->') 
     ) AS [ObjectType], 
     COUNT(*) AS [ObjectCount] 
FROM [master].sys.schemas ss 
INNER JOIN [master].sys.objects so 
     ON so.[schema_id] = ss.[schema_id] 
GROUP BY ss.[name], so.[type_desc] WITH ROLLUP; 

Beispiel 3: Hinzufügen von Identity-Spalte und INTO-Klausel Beispiel # 2

SELECT IIF(GROUPING(ss.[name]) = 0, ss.[name], N'Total') AS [SchemaName], 
     IIF(GROUPING(so.[type_desc]) = 0, 
      so.[type_desc], 
      IIF(GROUPING(ss.[name]) = 0, 
       N'Total for ' COLLATE Latin1_General_CI_AS_KS_WS + ss.[name], 
       N'---------------------------------------->') 
     ) AS [ObjectType], 
     COUNT(*) AS [ObjectCount], 
     IDENTITY(INT, 1, 1) AS [RowNum] 
INTO #TempResults 
FROM [master].sys.schemas ss 
INNER JOIN [master].sys.objects so 
     ON so.[schema_id] = ss.[schema_id] 
GROUP BY ss.[name], so.[type_desc] WITH ROLLUP; 

SELECT * FROM #TempResults ORDER BY [RowNum]; 
+0

Nice one! Diese viel informativere Antwort als meine (gelöscht). Eine * dumme * Frage, ich habe die Gruppe nicht mit dem Rollup verwendet, sie fügt ZZ immer automatisch hinzu, oder das ist etwas, das du manuell hinzufügst? – gofr1

+0

@ gofr1 Nein, 'ROLLUP' muss' NULL' verwenden, wahrscheinlich weil es der einzige gemeinsame "Wert" ist, der für alle Datentypen verwendet werden kann. Die "Total" und "ZZTotal" werden manuell über "ISNULL" oder "IIF"/"CASE" hinzugefügt, wie ich hier beschrieben habe. –

+0

Danke, zur Verdeutlichung! – gofr1