涉及CREATE TABLE的Microsoft SQL Server语法错误

时间:2016-03-03 23:54:36

标签: sql-server

我是使用Microsoft SQL进行编程的新手,我正在尝试设计一个支持随时间存储数据的表,最终可用于绘制图形。我发现一篇文章(https://www.simple-talk.com/sql/database-administration/database-design-a-point-in-time-architecture/)似乎指向一种可以支持类似内容的设计。但是,当我尝试使用它时,CREATE TABLE上的测试代码似乎不起作用。

CREATE TABLE [dbo].[Test_PTA_Table](
   [TestTablePK] [int] IDENTITY(1,1) NOT NULL,
   [TestTableText] [varchar](50) 
       COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
   [DateCreated] [datetime]     

       NOT NULL CONSTRAINT [DF_Test_PTA_Table_DateCreated]

                                      DEFAULT (getdate()),
   [DateEffective] [datetime] NOT NULL,
   [DateEnd] [datetime] NULL,
   [OperatorCode] [varchar](50) 

       COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
   [DateReplaced] [datetime] NULL   

       CONSTRAINT [DF_Test_PTA_Table_DateReplaced]
                                   DEFAULT (getdate()),
 CONSTRAINT [PK_Test_PTA_Table] PRIMARY KEY CLUSTERED 
(
   [TestTablePK] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

这会在我的机器上抛出错误,说:

Msg 170, Level 15, State 1, Line 22
Line 22: Incorrect syntax near '('.

奇怪的是,一旦删除了有问题的代码行WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF),它就会起作用,所以我不确定这里发生了什么。当Create Table语法的文档在其帮助文件中支持时,为什么这行代码会导致问题?知道这个问题可能是一个缺少愚蠢的逗号或其他东西,但任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

语法有效,应该在SQL2008及更高版本上编译,但是,这样说,从脚本中删除这些选项是相对安全的。

关于他们的意思, PAD_INDEX指定索引填充,默认值为OFF。当它为ON时,fillfactor指定的可用空间百分比将应用于索引的中间级页面,否则中间级页面将填充到接近容量的位置。通常,您不应将此值设置为{ {1}}除非您确切知道自己在做什么

关于ON,当它为IGNORE_DUP_KEY(默认值)时,重复键值会导致错误并回滚整个语句。也就是说,如果语句试图插入多行,则不会插入任何行,但是,当它设置为OFF时,将忽略此错误,并插入其中一个重复行。由于此选项默认设置为ON,因此您可以从脚本中安全地将其删除。