#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