SQL Server: обновите все нулевые поля как 0

#sql-server

#sql-сервер

Вопрос:

Я хочу обновить некоторые строки, которые будут включать некоторые нулевые поля.

Как я могу обновить эти строки в SQL Server?

Я спрашиваю, потому что в строках 180 полей. 🙂

Пожалуйста, помогите мне.

Ответ №1:

Вы можете использовать динамический SQL для создания сценария для запуска. Следующее, вероятно, потребует настройки, чтобы исключить столбцы, которые вы не хотите обновлять и т.д.

 DECLARE @TableName nvarchar(500) = '[dbo].[T]'
DECLARE @DynSql nvarchar(max)

SELECT @DynSql = ISNULL(@DynSql ',','')   QUOTENAME(name)   '= ISNULL('   QUOTENAME(name)   ',0)'
FROM sys.columns 
WHERE object_id = OBJECT_ID(@TableName)

SET @DynSql = 'UPDATE '   @TableName   'SET '   @DynSql

PRINT @DynSql

--EXEC(@DynSql)
  

Ответ №2:

Я думаю, я понимаю, о чем вы спрашиваете. Это сгенерирует инструкцию update для каждого столбца в вашей таблице, которая установит его значение равным 0, если это значение равно null.

 declare @tableName nvarchar(100)
declare @querys varchar(max)
set @querys = ''
set @tableName = 'YOUR TABLE NAME HERE'

select @querys = @querys   'update '   @tableName   ' set '  
QUOTENAME(t.[name])   '=0 where '   QUOTENAME(t.[name])   ' is null;'
from (SELECT [name] FROM syscolumns
    WHERE id = (SELECT id 
        FROM sysobjects
        WHERE type = 'U'
        AND [NAME] = @tableName))t

select @querys

execute sp_executesql @sqlQuery
  

Комментарии:

1. По-видимому, кто-то еще думал в том же направлении.

2. это полезно, но не точно. он генерирует инструкцию update для всех столбцов, так что, если есть какие-либо столбцы string или date, окончательный запрос завершится ошибкой

3. приведенная инструкция выполняет именно то, что описано выше — устанавливает для всех столбцов значение 0, если null. Не очень полезное действие, и, как вы указали, делает много предположений о природе столбцов. Но вы вольны вносить любые изменения для размещения строковых полей или подмножества столбцов и т.д., Так как, опять же, это всего лишь примерный фрагмент того, что можно было бы сделать.

Ответ №3:

Ну, это старый пост, но недавно у меня возникла эта проблема, и я хотел выполнить динамический SQL-запрос, используя вышеупомянутое решение, которое выполняло обновление в зависимости от типов столбцов.

             USE [YOUR DATABASE] 
            DECLARE @tableName nvarchar(100) 
            DECLARE @name varchar(50) 
            DECLARE @dtype varchar(50) 
            DECLARE @CMD NVARCHAR (200) 

            SET @tableName = [YOUR TABLE NAME] 


            DECLARE db_cursor CURSOR FOR 

                  SELECT c.name, t.name AS Dtype 
                  FROM sys.columns c 
                  INNER JOIN sys.types t 
                  ON t.system_type_id = c.system_type_id 
                  WHERE c.[object_id] = 
                      (SELECT [object_id] FROM sys.objects WHERE type = 'U' AND [NAME] = @tableName) 

            OPEN db_cursor 
            FETCH NEXT FROM db_cursor INTO @name, @Dtype 

            WHILE @@FETCH_STATUS = 0 BEGIN

            SET @CMD = 'UPDATE '   @tableName   ' SET '   quotename(@name)  ' = '   

               (CASE 
                 WHEN (@Dtype = 'bit') THEN '0' 
                 WHEN (@Dtype = 'int') THEN '0' 
                 WHEN (@Dtype = 'decimal') THEN '0' 
                WHEN (@Dtype = 'date') THEN '''1/1/1900''' 
                WHEN (@Dtype = 'datetime') THEN '''1/1/1900'''
              WHEN (@Dtype = 'uniqueidentifier') THEN '00000000-0000-0000-0000-000000000000' 
              ELSE '''''' 
              END ) 
              ' WHERE '   quotename(@name)  ' IS NULL' 

            PRINT @CMD 

            EXEC sp_executeSQL @cmd 

            FETCH NEXT FROM db_cursor INTO @name, @Dtype 

            END 

            CLOSE db_cursor 
            DEALLOCATE db_cursor