在 ssms 中创建数据库模式脚本

Create a database schema-script in ssms

我在 sql 服务器上有一个功能齐全的数据库。大约40张桌子。我必须在多个其他 sql 服务器实例上安装此模式(仅模式,而不是数据)。 SSMS 提供了一种使用任务 --> 生成脚本自动生成模式的好方法。有点用,但我不确定我是否理解正确:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TableName]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[TableName](
    [id] [uniqueidentifier] NOT NULL,
    [history] [varchar](max) NOT NULL,
    [isdeleted] [bit] NOT NULL,
 CONSTRAINT [PK_RecGroupData] PRIMARY KEY CLUSTERED 
(
    [rid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
END

GO
IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[DF_TableName_id]') AND type = 'D')
BEGIN
ALTER TABLE [dbo].[TableName] ADD  CONSTRAINT [DF_TableName_id]  DEFAULT (newid()) FOR [id]
END
--Just showing one ALTER TABLE and IF NOT EXISTS. The others are generated in the same way.

如果我执行脚本,创建一个内容完全相同的新脚本,但向其中添加一个新列,会发生什么情况 (--> idhistoryisdeletedtimestamp)?它会自动添加新行吗?我想是的,当然,但我不明白,如果列应该是 NOT NULLVARCHARBIT 或类似的东西,它怎么知道的。它只会执行

ALTER TABLE [dbo].[TableName] ADD  CONSTRAINT [DF_TableName_id]  DEFAULT (newid()) FOR [id]

(id => 新样本列) 但是没有关于数据类型或任何其他修饰符的任何信息。 另外,如果我第二次执行这样的脚本,它会抛出一些错误:

Meldung 1781, Ebene 16, Status 1, Zeile 3 An die Spalte ist bereits ein DEFAULT-Wert gebunden.

翻译为:

Message 1781, level 16, status 1, line 3 A DEFAULT value is already bound to the column.

为什么会这样?

错误消息说之前有一个默认值分配给该列。 还有:

ALTER TABLE [dbo].[TableName] ADD  CONSTRAINT [DF_TableName_id]  DEFAULT (newid()) FOR [id]

不是添加新列的语法 - 这是将 NEWID() 的默认值添加到列 [id]。 要添加一个列,你应该遵循 this steps(里面有一个例子)。 另外 SQL 服务器如何从您手动添加的行中知道新列的设置?它只会允许您根据需要定义它们并接受语法是否正确,或者如果在脚本解析过程中不正确则通过错误接受(可以在 SSMS 中通过 [ctrl] + [F5] 完成)。