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