Сбросить подмножество столбцов к их значениям по умолчанию в SQL? - PullRequest
1 голос
/ 01 апреля 2011

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

Концептуально, я ищу

UPDATE eirProj 
SET <all columns named like 'paf%'> TO THEIR DEFAULT OR NULL
WHERE prjId=@prjId

или хотя бы

UPDATE eirProj 
SET pafAuth=<pafAuth default or NULL>, pafComp=<pafComp default or NULL>, paf...
WHERE prjId=@prjId

Я пытаюсь избежать жесткого кодирования значений по умолчанию в двух местах (определение таблицы и этот код сброса). В идеале, но менее критично, я бы хотел избежать жесткого кодирования имен столбцов, чтобы оно все равно работало, если подмножество изменяется путем добавления, удаления или переименования столбцов.

Я работаю в SQL Server, и решения, специфичные для T-SQL, в порядке, если это единственный способ сделать это.

1 Ответ

8 голосов
/ 01 апреля 2011

Вы можете использовать ключевое слово default

CREATE TABLE dbo.eirProj
  (
     paf1 INT DEFAULT(100),
     paf2 INT NULL
  )

INSERT INTO dbo.eirProj
VALUES      (1,
             1)

UPDATE dbo.eirProj
SET    paf1 = DEFAULT,
       paf2 = DEFAULT

SELECT *
FROM   dbo.eirProj  

Возвращает

paf1        paf2
----------- -----------
100         NULL

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

DECLARE @Script NVARCHAR(MAX)

SELECT @Script = ISNULL(@Script + ',', '') + QUOTENAME(name) + ' =default'
FROM   sys.columns
WHERE  object_id = object_id('dbo.eirProj')
       AND name LIKE '%paf%'

IF ( @@ROWCOUNT = 0 )
  RETURN

SET @Script = 'UPDATE dbo.eirProj SET ' + @Script

EXEC(@Script)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...