update una tabla row_number registros partir otra numero generar fila ejemplos datos contador consecutivo actualizar sql sql-server tsql sql-update

una - row_number sql server 2008 ejemplos



Quiero usar la instrucción CASE para actualizar algunos registros en SQL server 2005 (3)

UPDATE dbo.TestStudents SET LASTNAME = ( CASE WHEN (LASTNAME = ''AAA'') THEN ''BBB'' WHEN (LASTNAME = ''CCC'') THEN ''DDD'' WHEN (LASTNAME = ''EEE'') THEN ''FFF'' ELSE (LASTNAME) END )

La declaración funciona para este fin, pero la condición else examina todos los registros de la tabla. ¿Hay alguna forma de que pueda dejar las filas no afectadas tal como están?


Agregar una cláusula WHERE

UPDATE dbo.TestStudents SET LASTNAME = CASE WHEN LASTNAME = ''AAA'' THEN ''BBB'' WHEN LASTNAME = ''CCC'' THEN ''DDD'' WHEN LASTNAME = ''EEE'' THEN ''FFF'' ELSE LASTNAME END WHERE LASTNAME IN (''AAA'', ''CCC'', ''EEE'')


Este es también un uso alternativo de mayúsculas y minúsculas cuando ...

UPDATE [dbo].[JobTemplates] SET [CycleId] = CASE [Id] WHEN 1376 THEN 44 --ACE1 FX1 WHEN 1385 THEN 44 --ACE1 FX2 WHEN 1574 THEN 43 --ACE1 ELEM1 WHEN 1576 THEN 43 --ACE1 ELEM2 WHEN 1581 THEN 41 --ACE1 FS1 WHEN 1585 THEN 42 --ACE1 HS1 WHEN 1588 THEN 43 --ACE1 RS1 WHEN 1589 THEN 44 --ACE1 RM1 WHEN 1590 THEN 43 --ACE1 ELEM3 WHEN 1591 THEN 43 --ACE1 ELEM4 WHEN 1595 THEN 44 --ACE1 SSTn ELSE 0 END WHERE [Id] IN (1376,1385,1574,1576,1581,1585,1588,1589,1590,1591,1595)

Me gusta el uso de las tablas temporales en los casos en que los valores duplicados no están permitidos y su actualización puede crearlos. Por ejemplo:

SELECT [Id] ,[QueueId] ,[BaseDimensionId] ,[ElastomerTypeId] ,CASE [CycleId] WHEN 29 THEN 44 WHEN 30 THEN 43 WHEN 31 THEN 43 WHEN 101 THEN 41 WHEN 102 THEN 43 WHEN 116 THEN 42 WHEN 120 THEN 44 WHEN 127 THEN 44 WHEN 129 THEN 44 ELSE 0 END AS [CycleId] INTO ##ACE1_PQPANominals_1 FROM [dbo].[ProductionQueueProcessAutoclaveNominals] WHERE [QueueId] = 3 ORDER BY [BaseDimensionId], [ElastomerTypeId], [Id]; ---- (403 row(s) affected) UPDATE [dbo].[ProductionQueueProcessAutoclaveNominals] SET [CycleId] = X.[CycleId] FROM [dbo].[ProductionQueueProcessAutoclaveNominals] INNER JOIN ( SELECT MIN([Id]) AS [Id],[QueueId],[BaseDimensionId],[ElastomerTypeId],[CycleId] FROM ##ACE1_PQPANominals_1 GROUP BY [QueueId],[BaseDimensionId],[ElastomerTypeId],[CycleId] ) AS X ON [dbo].[ProductionQueueProcessAutoclaveNominals].[Id] = X.[Id]; ----(375 row(s) affected)


Si no desea repetir la lista dos veces (según la respuesta de @JW), coloque las actualizaciones en una variable de tabla y use un JOIN en la UPDATE :

declare @ToDo table (FromName varchar(10), ToName varchar(10)) insert into @ToDo(FromName,ToName) values (''AAA'',''BBB''), (''CCC'',''DDD''), (''EEE'',''FFF'') update ts set LastName = ToName from dbo.TestStudents ts inner join @ToDo t on ts.LastName = t.FromName