我在sql server中有一个功能齐全的数据库。大约40张桌子。我必须在多个其他sql server实例上安装此架构(仅架构,而不是数据)。 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.
如果我执行脚本,创建一个包含完全相同内容的新脚本,但向其添加一个新列( - > id
,history
,{{1}和isdeleted
)?它会自动添加新行吗?当然,我认为是的,但我不知道,如果列应该是timestamp
,NOT NULL
,VARCHAR
或类似的东西,我会怎么知道。它只会执行
BIT
(ALTER TABLE [dbo].[TableName] ADD CONSTRAINT [DF_TableName_id] DEFAULT (newid()) FOR [id]
=>新样本列)
但是没有关于数据类型或任何其他修饰符的任何信息。
此外,如果我第二次像这样执行我的脚本,它会抛出一些错误:
Meldung 1781,Ebene 16,Status 1,Zeile 3 一个死亡的斯帕尔特(Desalits)就像是DEFAULT-Wert gebunden。
这意味着:
消息1781,级别16,状态1,第3行 DEFAULT值已绑定到列。
为什么会这样?
答案 0 :(得分:0)
错误消息表示之前已为该列分配了默认值。 也:
ALTER TABLE [dbo].[TableName] ADD CONSTRAINT [DF_TableName_id] DEFAULT (newid()) FOR [id]
不是添加新列的语法 - 这是将NEWID()的默认值添加到列[id]。 要添加列,您应该关注this steps(内部示例)。 另外,SQL Server如何通过手动添加的行知道新列的设置设置?它只是允许你根据需要定义它们并接受语法是否正确或者如果不是在脚本解析过程中通过错误(可以通过SSMS中的[ctrl] + [F5]完成)。