none
Variable nach with begin..end nicht verfügbar RRS feed

  • Frage

  • Hallo,

    blöden Frage, ich habe im Script eine Variable declariert "declare @buffer nvarchar(max)", befülle diese Variable und kann diese auch vor einem While Begin...End - Block auch abfragen.

    Innerhalb des While Begin...End - Block hänge ich weiteren Text der Variablen an und möchte dann nach dem Block die Variable verwenden, doch nach dem Block wird für die Variable nichts mehr ausgegeben.

    Gebe ich den Zustand der Variable innerhalb des Block aus (print @buffer), sehe ich wie der Inhalt passend erweitert wird, aber nach dem Block wird mir nichts mehr ausgegeben.

    Was mache ich falsch? Ich verwende kein GO was die Variable löschen würde...

    Viele Grüsse,
    Maximilian


    • Bearbeitet MaxiTesch Donnerstag, 11. April 2013 20:53
    Donnerstag, 11. April 2013 19:55

Alle Antworten

  • Hallo Maximilian,

    kannst Du das bitte mal in einem reduzierten Beispiel nachstellen und den Code der SP dann hier posten?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 11. April 2013 20:34
    Moderator
  • Hallo Stefan,

    sorry wenn mein Script den Profis die Nackenhaare sträuben lässt :-) Folgendes habe ich soweiti geschrieben, lasse ich die Variable @tAttPath innerhalb des While Begin...End - Block ausgeben, habe ich noch ein Wert, danach nicht mehr.

    -- Arbeitsvariablen
    declare @tSourceID nvarchar(max)
    declare @tEntryID nvarchar(max)
    declare @tAttPath nvarchar(max)
    -- gesuchtes Dokument
    declare @docid nvarchar(max) = 'BC611533-AE4A-469C-AF94-89FD908024D8'
    -- Dokumentenname erfassen
    set @tAttPath =
    	(select Ref from Prod_Documents where DocumentID = @docid) + ' ' +
    	(select Name from Prod_Documents where DocumentID = @docid) +
    	(select Extn from Prod_Documents where DocumentID = @docid)
    -- SourceID vom Dokument
    set @tSourceID = (select SourceID from Prod_Documents where DocumentID = @docid)
    -- Folder hinzufügen sofern vorhanden
    set @tEntryID = (select FolderID from Prod_Folders where FolderID = @tSourceID)
    while @tEntryID <> ''
    begin
    	set @tAttPath = (select FolderName from Prod_Folders where FolderID = @tEntryID) + '¦' + @tAttPath
    	set @tEntryID = (select SourceID from Prod_Folders where FolderID = @tEntryID)
    end
    -- Activities hinzufügen
    set @tEntryID = (select SubActivityID from Prod_Documents where DocumentID = @docid)
    while @tEntryID <> ''
    begin
    	set @tAttPath = 
    		(select ReferenceNumber from Prod_Structure where ID = @tEntryID) + ' ' +
    		(select Caption from Prod_Structure where ID = @tEntryID) + '¦' + @tAttPath
    	set @tEntryID = (select ParentID from Prod_Structure where ID = @tEntryID)
    	print @tAttPath
    end
    -- Ausgabe Pfad und Attachment
    select @tAttPath

    Wie ich gelesen habe, gibt es ja keine globale Variable @@ da dies alles "Variablen" des SQL Server sind. Wie aber kann ich den Wert bis zum schluss beibehalten? Ziel ist es eine Struktur eines Dokuments darzustellen. Die Werte passen soweit, aber ich bekomme die nicht bis zum Ende.

    Viele Grüsse,
    Maximilian

    Donnerstag, 11. April 2013 20:51
  • Hallo Maximilian,

    ich meinte reduziertes Beispiel wörtlich^^

    declare @Test  nvarchar(max)
    declare @Test2 nvarchar(max) = 'Abc'
    
    SET @Test = ( SELECT '1' ) + ' ' + ( SELECT '2' ) + ' ' + ( SELECT '3' )
    
    WHILE @Test2 <> ''
    BEGIN
    	SET @Test  = ( SELECT '4' ) + '¦' + @Test
    	SET @Test2 = ''
    END
    
    SET @Test2 = 'Abc'
    
    WHILE @Test2 <> ''
    BEGIN
    	SET @Test  = ( SELECT '5' ) + '¦' + @Test
    	SET @Test2 = ''
    	PRINT @Test
    END
    
    SELECT @Test
    PRINT @Test
    

    Also bei mir kommt da genau das erwartete Ergebnis. Prüf doch bitte mal, ob es da bei dir einen Unterschied gibt. Ich habe das Beispiel lediglich etwas kürzer gemacht und die Abhängigkeiten entfernt.

    Was natürlich passieren könnte, ist, dass Du irgendwo NULL hinzufügst. In dem Fall ist @tAttPath dann auch NULL.

    ---

    BTW: Kann es evtl. sein, dass Du die Ausgabe an der falschen Stelle suchst PRINT und SELECT geben die Daten im SSMS in zwei Reitern (SELECT bei "Ergebnisse", PRINT bei "Meldungen" aus)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 11. April 2013 21:00
    Moderator
  • Hallo Stefan,

    ich habe das Beispiel bei mir ebenfalls ausgeführt, soweit klappt es, lustigerweise bei mir mit meinem Script nicht.

    Um zu sehen weshalb es nicht klappt, werde ich das ganze nochmal aufbauen und ausgeben, verstehe derzeit nur nicht weshalb es mit meinem Script nicht funktioniert.

    Die beiden Reiter sind klar, mir wird einfach der Wert innerhalb der While-Schleife schön erweitert und ausserhalb aber nicht mehr angezeigt.

    Ich würde mich morgen nochmal melden.

    Vielen Dank vorerst,
    Maximilian

    Donnerstag, 11. April 2013 21:06
  • doch nach dem Block wird für die Variable nichts mehr ausgegeben.

    Hallo Maximilian,

    was genau meinst Du mit "nichts", wird ein Leerstring ausgegeben oder NULL?

    Bedenke: NULL + irgendwas ergibt immer NULL. Du fügst an die Variable @tAttPath inner das Ergebnis einer Selektion an, und wenn die mal ein NULL liefert, dann ist ab dann die Variable immer NULL, egal was Du im weiteren machst.

    Du könntest zur Sicherheit die NULL Werte z.B. mit ISNULL in einen Leerstring umwandeln, allein schonmal zu Test, um zu sehen, ob es daran liegt.

    SET @tAttPath = ISNULL( (select feld from dbo.tabelle), '') + @tAttPath;



    Olaf Helper

    Blog Xing

    Freitag, 12. April 2013 06:01