SQL Server: обновить все пустые поля как 0 - PullRequest
0 голосов
/ 25 мая 2011

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 26 мая 2011

Вы можете использовать динамический 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)
1 голос
/ 26 мая 2011

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

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
0 голосов
/ 28 мая 2015

Ну, это старый пост, но недавно у меня возникла эта проблема, и я хотел получить динамический 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...