sql-server - MSSQL : alter column not null, 一般

标签 sql-server types null alter-table alter-column

在 Microsoft SQL Server 2008 R2 中,我想将一个可为空的列更改为不为空。显然,我可以通过重述数据类型来做到这一点,如

alter table t alter column c int not null

例如,如果列 t.c 是 int 数据类型。但是一般情况下,如果不重新说明现有数据类型呢?我正在寻找一些等价的
alter table t alter column c not null

现有数据类型保留在原位,并且仅关闭可空性。

背景

我对我的数据库进行了审计,发现许多情况下,列被指定为可为空,但实际上没有出现空值。我想收紧架构以禁止这些列中的空值。手动将 DDL 写入每个“更改列”很容易出错,因为我可能会弄错数据类型。我可以使用模式转储程序自动生成代码,该程序输出每列的现有数据类型,但这也有风险,如果转储程序不知道最新的数据类型并输出其他内容(例如,假设它不知道 datetime2 而是写出 datetime)。

SQL 服务器已经知道列类型是什么,所以肯定有办法告诉它保留它并关闭可空性。

如果除了找到现有的数据类型将其放入 DDL 之外真的没有办法做到这一点,也许您可​​以推荐一个合适的工具来使用?我从 Sybase 时代就知道 dbschema.pl,但可能有更现代的东西,或者一些众所周知的 SQL 片段,可以从模态视图中打印出必要的语句。

最佳答案

两种方法:

1) 展开 this answer包括考虑 max_length、precision、scale 和 collat​​ion_name。如果你有多个模式,你也需要适应它。

SELECT
  'ALTER TABLE '
    +QUOTENAME(aud.[table_name])
    +' ALTER COLUMN '
    +QUOTENAME(aud.[column_name])
    +TYPE_NAME([system_type_id])
    +' NOT NULL;'
FROM MyColumnAuditList aud
INNER JOIN sys.columns col ON (
  col.[object_id] = OBJECT_ID(aud.[table_name]) AND
  col.[name] = aud.[column_name]
)

2) 在 SSMS 中,右键单击数据库并选择“脚本数据库为”。使用您选择的文本解析工具从结果中提取列定义。

关于sql-server - MSSQL : alter column not null, 一般,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20473674/

相关文章:

mysql - 在有或没有索引的情况下复制数据库?

sql-server - 如何检测和约束SQL表中行值之间的更改?

SQL Server 性能提示

java - 具有多种有界类型的逗号或&符号?

c - 定义类型的顺序

typescript - 文字类型推断 - Typescript

c# - 将裸空文字与用户定义的运算符一起使用时奇怪的重载解决方案

sql - aws redshift 中的 ILIKE 和 NOT ILIKE 与 total 不同

sql-server - SQL Server (2014) 来自 IN 变体的奇怪行为(列表)

c# - 在 C# 中连接字符串时处理 null 异常的最佳方法?