2016-10-09 5 views
1

Ich bekomme Temp-Tabelle mit dynamisch generierten Spalten lassen sagen, es ist Spalten A,B,C,D usw. aus anderen Quellen.Isnull für dynamisch generierte Spalte

Jetzt in meiner Hand habe ich Temp-Tabelle mit Spalte generiert. Ich musste gespeicherte Prozedur mit der Verwendung der temporären Tabelle schreiben.

So ist meine gespeicherte Prozedur wie

create proc someproc() 
as 
begin 
Insert into #searchtable 
select isnull(#temp.*,0.00) 
End 

Jetzt #searchresult ist Tabelle von mir zum Speichern von temporären Tabellenspalten erstellt. Das Problem tritt auf, wenn ich isnull für #tempdb Spalten überprüfen möchte. Weil es aus der Quelle kommt, kann es 3 Spalten sein, beim nächsten Mal kann es 4 Spalten sein. Es ändert.

Da sie dynamisch erzeugt wird, kann ich nicht jeden Spaltennamen verwenden und wie unten:

isnull(column1,0.00) 
isnull(column2,0.00) 

ich alle Spalte erzeugt verwenden musste und prüfen, ob Wert leer Verwendung ist 0.00

ich dies unten versucht aber nicht funktioniert:

isnull(##temp.*,0.00), 
+0

Zu breit ... Bitte, fügen Sie weitere Details hinzu. Sie haben eine Spalte, die Sie in die temporäre Tabelle einfügen, aber dann verwenden Sie Spalte1 Spalte2 usw. Dieser Teil ist nicht klar. – gofr1

+1

Ich bekomme Temp-Tabelle mit dynamisch generierten Spalten lassen sagen, es ist Spalten A, B, C, D usw. aus anderen Quellen .. Jetzt in meiner Hand habe ich Temp-Tabelle mit Spalte generiert .. Ich musste StoredProcedure mit der Verwendung von Temp schreiben table ... Also meine gespeicherte Prozedur ist wie create proc someproc() as begin Einfügen in #searchtable select isnull (#temp. *, 0.00) End ... Jetzt #searchresult ist eine Tabelle, die von mir erstellt wurde, um temporäre Tabellenspalten zu speichern. Das Problem tritt auf, wenn ich isnull für # tempdb Spaltennamen überprüfen möchte. Weil von der Quelle es kommt, kann es 3 Spalten sein, wieder nächstes Mal kann es 4 Spalten sein. Es ändert .. – havin

Antwort

2

Versuchen mit dynamischem Code durch die Spaltennamen für Ihre dynamische Tabelle aus [database].NFORMATION_SCHEMA.COLUMNS holen

--Get the Column Names for the your dynamic table and add the ISNULL Check: 

DECLARE @COLS VARCHAR(MAX) = '' 

SELECT @COLS = @COLS + ', ISNULL(' + COLUMN_NAME + ', 0.00) AS ' + COLUMN_NAME 
FROM tempdb.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME LIKE '#temp[_]%' -- Dynamic Table (here, Temporary table) 

DECLARE @COLNAMES VARCHAR(MAX) = STUFF(@COLS, 1, 1, '') 

--Build your Insert Command: 

DECLARE @cmd VARCHAR(MAX) = ' 
INSERT INTO #temp1 
SELECT ' + @COLNAMES + ' FROM #temp' 

--Execute: 

EXEC (@cmd) 
+0

Thanks..I kann diese temporäre Tabelle nicht berühren Das erzeugt dynamisch erzeugte Spalte..Es kommt von einigen anderen Quellen..Jetzt musste ich gespeicherte Prozedur mit der Temp-Tabelle schreiben. Wie kann ich schreiben, wenn alle erzeugten Spalten null sind, ersetzen Sie es durch 0.00 ..Ich habe es mit isnull versucht (# Temp. *, 0.00), aber es funktioniert nicht .. Ist ihre Alternative ... – havin

+0

Sie können Tabellenwerte nach dem Einfügen von NULL auf 0,00 setzen?Teilen Sie Ihre vollständige Abfrage (mit SELECT und INSERT-Anweisungen) – p2k

+0

Temp Tabelle #temp Spalten generiert A, B, C (dynamisch erzeugt, die aus einer anderen Quelle stammt) Werte sind A = 10 B = null C = 20 D ..., jetzt hatte ich sp schreiben erstellen Proc SomeSp() als Insert into #searchtableresult wählen isnull (#temp. *, 0.00) #Searchtable ist die Tabelle, die ich erstellt zu speichern die Ergebnisse von der Tempentabelle (entsprechend meiner Anforderung). Hier wenn es normal Tabelle können wir verwenden, wie/ Insert into #searchtableresult wählen isnull (A, 0,00), isnull (B, 0,00) und so weiter. Da es dynamisch generierte Spalten Problem ist .. – havin

2

Hope, verstand ich Ihren Kommentar rechts:

CREATE PROCEDURE someproc 
AS 
IF OBJECT_ID(N'#searchtable') IS NOT NULL DROP TABLE #searchtable 

IF OBJECT_ID(N'#temp') IS NOT NULL 
BEGIN 

    DECLARE @sql nvarchar(max), 
      @cols nvarchar(max) 

    SELECT @cols = (
     SELECT ',COALESCE('+QUOTENAME([name])+',0.00) as '+QUOTENAME([name]) 
     FROM sys.columns 
     WHERE [object_id] = OBJECT_ID(N'#temp') 
     FOR XML PATH('') 
    ) 

    SELECT @sql = N'SELECT '+STUFF(@cols,1,1,'')+' INTO #searchtable FROM #temp' 

    EXEC sp_executesql @sql 

END 

Dieser SP prüft, ob #temp Tabelle vorhanden ist. Wenn vorhanden, werden alle Spaltennamen aus sys.columns Tabelle übernommen und wir machen eine Zeichenfolge wie ,COALESCE([Column1],0.00) as [Column1], etc. Dann machen wir eine dynamische SQL-Abfrage wie:

Und führen Sie es aus. Dieses Abfrageergebnis wird in #searchtable gespeichert.

Hinweise: Verwenden Sie COALESCE anstelle von ISNULL und sp_executesql statt direkt exec. Es ist eine gute Übung.

+0

Hey danke .. Beide Antworten funktionierten für mich..Könnte hier 2 Häkchen vergeben .. – havin

Verwandte Themen