2017-12-19 14 views
1

Ich muss Multi-Update-Anweisung generieren.Generieren Sie mehrere UPDATE-Anweisungen und führen Sie sie aus

Dieser Code:

DECLARE @query as varchar(max); 
SET @query = 

'declare @data_dzis as nvarchar(10) 
declare @data_wczoraj as nvarchar(10) 
SELECT @data_dzis=convert(varchar,convert(int,convert(datetime,convert(date,GETDATE())))) 
SELECT @data_wczoraj=convert(varchar,convert(int,convert(datetime,convert(date,GETDATE()-1)))) 

    Select 
     ''update V_''+IdStr + '' set start='' + @data_wczoraj + '' where DataVersionId=0 and start='' + @data_dzis +'';'' 
    FROM [KW_GRECOS].[dbo].[Variable] 
    where Granularity=0 and IdStr<>''_ROOT_FOLDER_''' 

exec(@query); 

... erzeugt Liste der Updates als Cord-:

update V_G012 set start=43085 where DataVersionId=0 and start=43086; 
update V_G059 set start=43085 where DataVersionId=0 and start=43086; 
update V_G002a set start=43085 where DataVersionId=0 and start=43086; 
update V_G0122 set start=43085 where DataVersionId=0 and start=43086; 
update V_103D set start=43085 where DataVersionId=0 and start=43086; 
update V_G072 set start=43085 where DataVersionId=0 and start=43086; 
update V_G201 set start=43085 where DataVersionId=0 and start=43086; 
update V_G001a set start=43085 where DataVersionId=0 and start=43086; 
update V_G067a set start=43085 where DataVersionId=0 and start=43086; 

Ich weiß nicht, wie sie automatisch auszuführen. Ich musste sie kopieren und manuell und ausführen, aber das ist nicht mein Punkt.

+0

getestet Weil es um ein Tutorial auf dynamische SQL läuft darauf hinaus, dies könnte genauso gut sein, ein Duplikat von [Dynamic SQL - EXEC (@SQL) versus EXEC SP \ _EXECUTESQL (@SQL)] (https://stackoverflow.com/questions/548090/dynamic-sql-execsql-versus-exec-sp-executesqlsql) –

+0

Was? Fehler bekommst du? Wenn kein Fehler welches Problem? – Paparazzi

Antwort

2

Erstens, Ihre Update-Anweisungen scheinen es so, als hätten Sie verschiedene Tabellen, die die gleichen Dateneinheiten beschreiben. Das ist ein schlechtes Datenbankdesign und sollte nach Möglichkeit überarbeitet werden.
Alle diese V_ + IdStr Tabellen sollten eine einzige Tabelle sein, wobei die IdStr nur eine weitere Spalte innerhalb ist.

Angenommen, dies nicht getan werden kann, glaube ich, der Rest meiner Antwort ist, was Sie suchen:

ändern @query Variable nvarchar(max) statt varchar(max) und verwenden sp_executeSql die Update-Anweisungen als Ausgabe zu erhalten Variable.
eine Variable Fügen Sie die Abfrageergebnisse in (ich habe es nannte @statements in meinem Beispiel, beachten Sie die Zeilen mit dem Added this! Kommentar) verketten:

DECLARE @query as nvarchar(max), 
     @Update nvarchar(max); 

SET @query = 

'declare @data_dzis as nvarchar(10) 
declare @data_wczoraj as nvarchar(10) 
SELECT @data_dzis=convert(varchar,convert(int,convert(datetime,convert(date,GETDATE())))) 
SELECT @data_wczoraj=convert(varchar,convert(int,convert(datetime,convert(date,GETDATE()-1)))) 
Set @statemets = ''''; -- Added this! 
Select @statemets += -- Added this! 
     ''update V_''+IdStr + '' set start='' + @data_wczoraj + '' where DataVersionId=0 and start='' + @data_dzis +'';'' 
    FROM [KW_GRECOS].[dbo].[Variable] 
    where Granularity=0 and IdStr<>''_ROOT_FOLDER_''' 

EXECUTE sp_executesql @query, N'@statemets nvarchar(max) OUTPUT', @[email protected] OUTPUT 

PRINT @Update 
--EXECUTE sp_executesql @Update 

Sobald Sie sehen, dass die @Update Variable enthält die richtigen Update-Anweisungen , entfernen Sie die Zeile und entfernen Sie die Zeile Execute.

See a simplified live demo on rextester.

1

Sie brauchen nicht alles, was in der @query zu tun
Nicht

declare @data_dzis as nvarchar(10) 
declare @data_wczoraj as nvarchar(10) 
SELECT @data_dzis = convert(varchar,convert(int,convert(datetime,convert(date,GETDATE())))) 
SELECT @data_wczoraj = convert(varchar,convert(int,convert(datetime,convert(date,GETDATE()-1)))) 

DECLARE @query as nvarchar(max); 
SET @query = 'Select ''update V_''+ IdStr + '' set start='' + @data_wczoraj + 
      '' where DataVersionId=0 and start='' + @data_dzis +'';'' 
      FROM [KW_GRECOS].[dbo].[Variable] 
      where Granularity=0 and IdStr<>''_ROOT_FOLDER_''' 

exec(@query); 
+0

Während Ihre Beobachtung richtig ist, beantwortet sie die Frage nicht. Außerdem haben Sie ein '' 'vor dem' Select' vergessen. –

Verwandte Themen