IF OBJECT_ID('[dbo].[{table_name}]') IS NULLBEGINCREATE TABLE [dbo].[{table_name}] ( [Id] UNIQUEIDENTIFIER NOT NULL, ... CONSTRAINT [PK_{table_name}] PRIMARY KEY CLUSTERED ([Id] ASC) );ENDGO
删除表
删除表时,使用 IF EXISTS 以避免当表不存在时出现错误。
DROP IF EXISTS [dbo].[{table_name}]GO
添加列
您必须先检查该列是否存在,然后才能将其添加到表中:
IF COL_LENGTH('[dbo].[{table_name}]', '{column_name}') IS NULLBEGIN ALTER TABLE [dbo].[{table_name}] ADD [{column_name}] {DATATYPE} {NULL|NOT NULL};ENDGO
向现有表添加新的 NOT NULL 列时,请重新评估是否需要它。不要害怕在 C# 和应用层中使用 Nullable <T> 原语,这总比对 DB 的每一行使用默认值导致占用不必要的空间要好,特别是对于新功能或新特性,需要占用很长时间,才能对大多数行级数据(如果有的话)有用。
如果您决定添加 NOT NULL 列,请使用 DEFAULT 约束,而不是创建列、更新行以及更改列。这对于像 dbo.User 和 dbo.Cipher 这样的大型表尤其重要。我们在 Azure 中的 SQL Server 版本使用元数据作为默认约束。这意味着我们可以更新默认的列值,而无需更新表中的每一行(这将使用大量的 DB I/O)。
这个很慢:
IF COL_LENGTH('[dbo].[Table]', 'Column') IS NULLBEGIN ALTER TABLE [dbo].[Table] ADD [Column] INT NULLENDGOUPDATE [dbo].[Table]SET [Column] =0WHERE [Column] IS NULLGOALTER TABLE [dbo].[Column]ALTER COLUMN [Column] INT NOT NULLGO
这个更好:
IF COL_LENGTH('[dbo].[Table]', 'Column' IS NULLBEGIN ALTER TABLE [dbo].[Column] ADD [Column] INT NOT NULL CONSTRAINT D_Table_Column DEFAULT 0ENDGO
更改列数据类型
您必须将 ALTER TABLE 语句包装在条件块中,以便脚本的后续运行不会再次修改数据类型。
IF EXISTS ( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME ='{column_name}' AND DATA_TYPE ='{datatype}' AND TABLE_NAME ='{table_name}')BEGIN ALTER TABLE [dbo].[{table_name}] ALTER COLUMN [{column_name}] {NEW_TYPE} {NULL|NOT NULL}ENDGO