Update Statement - Column und Wert aus Variable

neubs

Neuer Benutzer
Beiträge
3
Hallo Leute,

ich hätte da mal eine Frage - steh bei nem Thema ziemlich aufm Schlauch ...

Ich habe hier eine Tabelle aus der lese ich über einen Cursor die letzten 5 Zeilen aus, Werte aus diesen Zeilen müssen in einer anderen Tabelle in eine Zeile in verschiedene Colums geschrieben werden.

Hier erstmal ein bisschen Code:
Code:
--Cursor über die letzten 5 Datensätze in der zwischenablage erstellen
       DECLARE zwCursor CURSOR FOR   SELECT TOP(@topcount) date, time, art FROM zwischenablage WHERE personalnr = @persnr ORDER BY ID DESC         
       OPEN zwCursor
       FETCH NEXT FROM zwCursor INTO @sDatum, @sTime, @sArt
       SET @cnt= 0
       --Cursor durchschleifen  
       WHILE @@FETCH_STATUS = 0
         BEGIN
           -- aus zeit und datumsstring einen datetime bauen
           SET @cnt = @cnt + 1
           SET @sTime = RTRIM(@sTime)
           SET @bookdate =  CAST(CONVERT( varchar(20), @sDatum + ' ' + @sTime, 104) AS DATETIME)
           --upzudatende Felder festlegen
           SET @bfield = 'last_book' + CAST(@cnt AS varchar)
           SET @bfield2 = 'last_book' + CAST(@cnt AS varchar) + '_type'
           --update ausführen
           UPDATE web_infocenter SET  @bfield = @bookdate , @bfield2 = @sArt WHERE persnr =  @persnr           
           --nächster Datensatz
           FETCH NEXT FROM zwCursor INTO @sDatum, @sTime, @sArt
         END
       
       CLOSE zwCursor
       DEALLOCATE zwCursor

Das Problem scheint die Update Anweisung zu sein, da in die Variable @bfield der Wert aus @bookdate geschrieben wird, ich habe nur leider keinen Schimmer wie ich das schriben kann ohne eine IF Anweisung mit 5 leicht unterschiedlichen Update Anweisungen einzubauen.

Hat jemand vielleicht n Tip für mich - wäre super.

Vielen Dank schon mal

Sebastian
 
Werbung:
Ich bin nicht sicher ob du dich nicht vieleicht vertan hast. Das TOP(@variable) funktioniert auch bei nicht dynamischem SQL. Aber bei UPDATE web_infocenter SET @bfield aktualisierst du keine Spalte der Tabelle sondern eine Variable, gleiches gilt für @bfield2. Ist das wirklich Absicht?
 
Hallo Danke für die Antworten.
@ukulele
Das hatte ich ja auch schon rausbekommen, dass @bfield = @bookdate -die Variable @bfield aktualisert. Ist vielleicht in meinem ersten Post nicht so klar rübergekommen
Ich weis leider nur nicht wie ich das vom code her schreiben kann (oder ob das überhaupt geht) das für @bfield die colum die da drin steckt und nicht die Variable für die Update Anweisung rüberkommt.
Wenn ich das ganze als String schreibe und dann als exec ausführe muss ich ja auch wieder nen Convert oder so machen, weil ja @bookdate ein Datetime ist - oder bin ich da aufm Holzweg.

Ich hab das Problem zwar erstmal umgangen damit mein Projekt weiterkommt - aber wenn du ne Antwort hast würde mich das ganze schon mal interessieren ;)
 
Also wenn du das machen willst hat akretschmer Recht, du musst dann mit dynamischem SQL arbeiten und ja, du musst einen Datumswert dann als String mit verketten und der String muss dann beim Execute den Wert auch wieder sauber in DATETIME konvertieren. Ist aber auch kein Hexenwerk wenn mans sauber zusammen baut.
 
Danke für die Antwort - werde das mal zusammenbauen ... steh immer so ein bissl mit den SQL Datumskonvertierungen auf Kriegsfuß - aber das bekomm ich schon hin ;)
 
Das schwierige ist das ganze Sprachunabhängig hin zu bekommen. Hast du US Layout, kriegst du JJJJ-TT-MM in der Ausgabe. Hast du DE Layout kriegst du JJJJ-MM-TT in der Ausgabe, cast() erwartet aber doch wieder etwas anderes...

Daher am Besten mit convert() und explizitem Format arbeiten, sowohl beim erzeugen des String als auch beim Rückumwandeln in DATETIME bevor es in dem dynamischem SQL Statement verwendet wird.
Code:
DECLARE   @i VARCHAR(1000)
SET     @i = 'SELECT   convert(DATETIME,''' + convert(VARCHAR(23),getdate(),21) + ''',21)'
EXEC(@i)
 
Werbung:
alternativ kann man die Variable am Anfang des Cusors wieder Leern
Set @Vari =''

stehe ich jetzt auf dem Schlauch? aber man könnte hier doch auch ein Update schreiben

update web
set web.date = result.date, web.time = result.time, web.art = result.art
from (
select top 5 date, time, art, personalnr
FROM zwischenablage
ORDER BY ID DESC ) as Result
join web_infocenter web on web.persnr = Result.personalnr

DECLARE zwCursor CURSOR FOR SELECT TOP(@topcount) date, time, art FROM zwischenablage WHERE personalnr = @persnr ORDER BY ID DESC

sollen die letzten 5 zeilen von einer personalnummer sein? ist das nur ein ausschnitt eines Skriptes?

UPDATE web_infocenter SET @bfield = @bookdate , @bfield2 = @sArt WHERE persnr = @persnr

hier machst du ja kein Update auf die Tabelle, sonderen ein Update auf die Variablen.
 
Zurück
Oben