IF OBJECT_ID('[dbo].[{table_name}]') IS NULL
BEGIN
CREATE TABLE [dbo].[{table_name}] (
[Id] UNIQUEIDENTIFIER NOT NULL,
...
CONSTRAINT [PK_{table_name}] PRIMARY KEY CLUSTERED ([Id] ASC)
);
END
GO
删除表
删除表时,使用 IF EXISTS 以避免当表不存在时出现错误。
DROP IF EXISTS [dbo].[{table_name}]
GO
添加列
您必须先检查该列是否存在,然后才能将其添加到表中:
IF COL_LENGTH('[dbo].[{table_name}]', '{column_name}') IS NULL
BEGIN
ALTER TABLE [dbo].[{table_name}]
ADD [{column_name}] {DATATYPE} {NULL|NOT NULL};
END
GO
向现有表添加新的 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 NULL
BEGIN
ALTER TABLE
[dbo].[Table]
ADD
[Column] INT NULL
END
GO
UPDATE
[dbo].[Table]
SET
[Column] = 0
WHERE
[Column] IS NULL
GO
ALTER TABLE
[dbo].[Column]
ALTER COLUMN
[Column] INT NOT NULL
GO
这个更好:
IF COL_LENGTH('[dbo].[Table]', 'Column' IS NULL
BEGIN
ALTER TABLE
[dbo].[Column]
ADD
[Column] INT NOT NULL CONSTRAINT D_Table_Column DEFAULT 0
END
GO
更改列数据类型
您必须将 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}
END
GO
CREATE NONCLUSTERED INDEX [IX_OrganizationUser_UserIdOrganizationIdStatus]
ON [dbo].[OrganizationUser]([UserId] ASC, [OrganizationId] ASC, [Status] ASC)
INCLUDE ([AccessAll])
WITH (ONLINE = ON); -- ** THIS ENSURES ONLINE **