【问题标题】:MS SQL define default value for each column name via query loopMS SQL 通过查询循环为每个列名定义默认值
【发布时间】:2016-12-30 15:16:14
【问题描述】:

嘿,我希望有人有一个可以帮助批量处理的脚本

假设我有一张这样的桌子:

CREATE TABLE [dbo].[Table_3](
    [value1] [varchar](50) NOT NULL,
    [value2] [varchar](50) NOT NULL,
    [value3] [varchar](50) NOT NULL,
    [value4] [nchar](10) NOT NULL
) ON [PRIMARY]

我想为 (a.k.a. '' ) 输入一个空白,而不是 NOT NULL

现在我知道可以这样做:

ALTER TABLE [dbo].[Table_3] ADD  CONSTRAINT [DF_Table_3_value1]  DEFAULT ('') FOR [value1]
GO
ALTER TABLE [dbo].[Table_3] ADD  CONSTRAINT [DF_Table_3_value2]  DEFAULT ('') FOR [value2]
GO
etc...

但我不想为每一列手动执行此操作,因为我的一些表有 100 多列。

是否有任何类型的查询会遍历我的所有列并将它们设置为我的默认 ('')

【问题讨论】:

  • 查看游标和动态 SQL。或者,只需在文本编辑器中使用正则表达式替换生成所有语句。
  • 这让我想知道你为什么要花这么多时间来避免NULL 值。
  • @GordonLinoff 不是我做的。我拿起一个旧的访问数据库并将其转换为 MS SQL。他们在构建访问数据库方面做得并不好。
  • 这可以给你一个想法SELECT 'ALTER TABLE [dbo].[Table_3] ADD CONSTRAINT [DF_Table_3_'+name+'] DEFAULT ('') FOR ['+name+']' FROM sys.columns WHERE [object_id] = OBJECT_ID('[dbo].[Table_3]');
  • @StealthRT -- 这不是戈登的观点。在 SQL 中,空值是一件好事。如果数据模型有空值而不是空字符串,这将非常有用。因为您不习惯使用空值而替换所有空值让我们担心 - 我们知道在短时间内您会提出一些问题,这些问题可以通过保留空值来解决。

标签: sql sql-server sql-server-2012 ssms sql-server-2014


【解决方案1】:

这是一种方法

DECLARE @tblName VARCHAR(MAX)
DECLARE @SQL VARCHAR(MAX)

SET @tblName = 'Table_3'
SET @SQL = (SELECT 'ALTER TABLE [dbo].[' + @tblName + '] ADD  CONSTRAINT [DF_' + @tblName + '_'
                   + COLUMN_NAME + '] DEFAULT ('''') FOR '
                   + Quotename(COLUMN_NAME) + '; '
            FROM   INFORMATION_SCHEMA.COLUMNS
            WHERE  TABLE_NAME = @tblName 
                   AND COLUMN_NAME LIKE 'value%'
                   AND IS_NULLABLE = 'NO'
            FOR XML PATH(''))

--PRINT @SQL
EXEC (@SQL) 

在一个表中包含 100 多列听起来不正确。您可能需要重组您的表格

【讨论】:

  • 100 多个表只是一个例子,而不仅仅是少数需要手动复制和粘贴的表......
【解决方案2】:

这个脚本应该可以工作

 select 'alter table TABLE add constraint DF_TABLE_' 
         + name  + ' DEFAULT ('''') FOR ' + name  
 from sys.columns 
 where object_id = object_id('TABLE')

【讨论】:

  • 如果您能解释name 的来源,这个答案将会得到改进。 OP 说他们不想手动指定每一列。就目前而言,您的回答并未解释如何解决该问题。
猜你喜欢
  • 1970-01-01
  • 2021-07-27
  • 2015-07-12
  • 1970-01-01
  • 2020-06-05
  • 2019-08-11
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多