Fragensteller
Variable nach with begin..end nicht verfügbar

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