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

Posted

技术标签:

【中文标题】在 SQL 中将列的子集重置为其默认值?【英文标题】:Reset a subset of columns to their default values in SQL? 【发布时间】:2011-04-01 16:03:07 【问题描述】:

我正在寻找一个 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】:

您可以使用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

除非您使用动态 SQL 生成上述内容,否则无法对所有名为 paf% 的列执行此操作。

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)  

【讨论】:

啊!很简单!我怀疑我把事情复杂化了……感谢您确认动态 SQL 是自动化列选择的唯一方法。 感谢后续脚本,它比我刚刚编写的脚本更强大。干杯。

以上是关于在 SQL 中将列的子集重置为其默认值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ORACLE TABLE 上重置列的默认值

将matplotlib.rcParams字典正确重置为其原始默认值

如何在 Linux 中将目录内容的用户和组重置为默认值?

Apollo 客户端:在清除或重置存储时保留/重置默认值

将 CSS 显示属性重置为默认值

SQL:将所有没有默认值的列的默认值设置为 NULL