在SQL中将列的子集重置为其默认值?

GIS*_*ers 1 sql defaults

我正在寻找一个SQL语句或存储过程来将一行中的列子集的值重置为其默认值(如此定义)或者为null.行中还有其他列我不想重置,否则我可以删除该行并创建一个新的行,该行将使用各种默认值进行初始化...这就是我想要的效果,但仅限于列的特定子集.

从概念上讲,我在寻找

UPDATE eirProj 
SET <all columns named like 'paf%'> TO THEIR DEFAULT OR NULL
WHERE prjId=@prjId
Run Code Online (Sandbox Code Playgroud)

或至少

UPDATE eirProj 
SET pafAuth=<pafAuth default or NULL>, pafComp=<pafComp default or NULL>, paf...
WHERE prjId=@prjId
Run Code Online (Sandbox Code Playgroud)

我试图避免在两个地方冗余地对默认值进行硬编码(表定义和此重置代码).理想情况下但不那么重要我想避免硬编码列名,因此如果通过添加,删除或重命名列来更改子集,它仍然可以工作.

我正在使用SQL Server和特定于T-SQL的解决方案,如果这是唯一的方法.

Mar*_*ith 8

您可以使用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  
Run Code Online (Sandbox Code Playgroud)

返回

paf1        paf2
----------- -----------
100         NULL
Run Code Online (Sandbox Code Playgroud)

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)  
Run Code Online (Sandbox Code Playgroud)