query – SQL SERVER – cómo hacer un UPDATE a todas las columnas de una tabla de mas de 60 columnas


Tengo el siguiente problema con un SP que realiza una actualización de todas las columnas de una tabla, el Update busca los registros vacíos y los actualiza con valor “NULL”.

El problema es que la tabla es de más de 60 columnas y para no hacer el UPDATE columna por columna, utilicé el siguiente Query Dinámico:

!– language: lang-sql –>

DECLARE @col NVARCHAR(4000) =”, @query NVARCHAR(4000) =”

        SELECT @col= @col+
            c.NAME+' = CASE WHEN '+c.NAME+' like ''""'' OR '+c.NAME+' like ''''  THEN NULL ELSE '+c.NAME +' END,
        '
        FROM  sys.columns c
        JOIN sys.tables t
        ON t.object_id = c.object_id
        WHERE t.name = 'personas'
        and c.name not like 'UserId'
        and c.name in ('FirstName',
                        'LastName',
                        'BirthDate',
                        'Gender',
                        'Email',
                        'Identification',--... hasta la columna 30

        SET @col =LEFT(@col,LEN(@col)-6)

        SET @query = 'update personas 
        SET 
            '
        SET @query = @query+@col

        SET @query = REPLACE(@query, 'Authorization', '(Authorization)')


        --PRINT @query
        EXEC sp_executesql  @query

Y posterior a ese primer query hice este segundo query dinámico:

!– language: lang-sql –>

    set @col =''
        set @query=''

        SELECT @col= @col+
            c.NAME+' = CASE WHEN '+c.NAME+' like ''""'' OR '+c.NAME+' like ''''  THEN NULL ELSE '+c.NAME +' END,
        '
        FROM  sys.columns c
        JOIN sys.tables t
        ON t.object_id = c.object_id
        WHERE t.name = 'personas'
        and c.name not like 'UserId'
        and c.name not in ('FirstName',
                        'LastName',
                        'BirthDate',
                        'Gender',
                        'Email',
                        'Identification', --... hasta la columna 30

        SET @col =LEFT(@col,LEN(@col)-6)

        SET @query = 'update personas 
        SET 
            '
        SET @query = @query+@col

        SET @query = REPLACE(@query, 'Authorization', '(Authorization)')

        --PRINT @query
        EXEC sp_executesql  @query

Como ven, es un poco enredado y complejo, pero fue la mejor forma que encontré para solucionar este problema y contener la posibilidad que en un futuro esta tabla me llegue con otras columnas y que este UPDATE se actualice automáticamente.

En los detalles verán que tuve que usar los dos query, para partir el proceso en dos porque la cadena NVARCHAR(4000) no era suficiente para el UPDATE que se genera el código entonces a través del parámetro in y no in partí el proceso en dos.

La pregunta entonces que me permito hacer a la comunidad es preguntarles si existe otra forma más eficiente de programar este UPDATE en el SP de forma tal que la tabla que me llegue que de entrada se que van a ser mas de 60 columnas, pueda actualizar todas las columnas, buscando registros vacíos y reemplazándoos por el valor “NULL”

Muchas gracias por su tiempo.