Générez plusieurs instructions UPDATE et exécutez-les

Je dois générer une déclaration multi-mise à jour.

Ce 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); 

… génère une list de mises à jour en tant que jeu d'loggings:

 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; 

Je ne sais pas comment les exécuter automatiquement. J'ai dû les copyr et les exécuter manuellement, mais ce n'est pas mon propos.

Tout d'abord, vos instructions de mise à jour donnent l'printing que vous disposez de différents arrays décrivant les mêmes entités de données. C'est une mauvaise design de database et devrait être refactorisée si possible.
Toutes ces tables V_ + IdStr devraient être une seule table, où l' IdStr est juste une autre colonne à l'intérieur.

En supposant que cela ne puisse pas être fait, je crois que le rest de ma réponse est ce que vous cherchez:

Changez votre variable @query en nvarchar(max) au lieu de varchar(max) et utilisez sp_executeSql pour get les instructions de mise à jour en tant que variable de sortie.
Ajoutez une variable pour concaténer les résultats de la requête (je l'ai appelée @statements dans mon exemple, notez les lignes avec le commentaire Added this! ):

 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', @statemets=@Update OUTPUT PRINT @Update --EXECUTE sp_executesql @Update 

Une fois que vous voyez que la variable @Update contient les instructions de mise à jour correctes, supprimez la ligne Print et décommentez la ligne Execute .

Voir une démo en direct simplifiée sur rextester.

Vous n'avez pas besoin de faire tout cela dans le @query
Pas testé

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