我正在创建一个脚本来创建一个表。当表格有大对象列如varchar(max)
表格需要文字时TEXTIMAGE_ON [PRIMARY]
。
要确定文件组的名称,我使用系统表sys.filegroups
和列name
. 这将返回文件组的名称。在上面的例子中是PRIMARY
.
但是,我正在编写脚本的其中一个表具有以下值:PRIMARY
当表中没有 text、ntext、varchar(max) 等列时。因此,当脚本到达此表时,它会失败,因为TEXTIMAGE_ON
不允许除非你有一个大的对象列。
为什么系统表中sys.filegroups
的name
不是NULL
因为不应该设置TEXTIMAGE_ON?
这是我用来获取 TextImageOnFileGroup 属性的查询:
SELECT [Table].name AS "TableName", fg.name AS "TextImageOnFileGroup"
FROM sys.tables as [Table] left outer join sys.filegroups as fg on [Table].lob_data_space_id = fg.data_space_id
WHERE [Table].name in ('ProviderSpecialty', 'ProviderState', 'ProviderExclusion')
这返回
TableName TextImageOnFileGroup
ProviderSpecialty PRIMARY
ProviderState NULL
ProviderAttribute PRIMARY
表ProviderState没有任何具有大对象的列,因此 TextImage_On 为 NULL。这是意料之中的。
CREATE TABLE [dbo].[ProviderState](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ProviderId] [numeric](19, 0) NOT NULL,
[State] [nvarchar](2) NOT NULL,
CONSTRAINT [PK_dbo.ProviderState] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
表ProviderAttribute有一个varchar(max)
列,因此应该设置 TextImage_on 属性:
CREATE TABLE [dbo].[ProductAttribute](
[ProductAttributeId] [int] IDENTITY(1,1) NOT NULL,
[Description] [nvarchar](max) NOT NULL,
CONSTRAINT [PK_dbo.ProductAttribute] PRIMARY KEY CLUSTERED
(
[ProductAttributeId] 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]
表ProviderSpecialty是问题所在。它设置了 TextImage_on 属性,但没有列可以保证这一点。
CREATE TABLE [dbo].[ProviderSpecialty](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ProviderId] [numeric](19, 0) NOT NULL,
[SpecialtyId] [int] NOT NULL,
CONSTRAINT [PK_dbo.ProviderSpecialty] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
我正在使用系统表来创建创建这些表的脚本。如果表中的属性name
设置sys.filegroups
为PRIMARY
我添加到表脚本'TEXTIMAGE_ON [PRIMARY]`。
当我为此表运行脚本时,它会出错,因为除非有文本列、varchar(max) 等,否则不允许使用 TEXTIMAGE_ON 属性。
如果不需要,为什么要在系统表中设置属性?