0

我正在创建一个脚本来创建一个表。当表格有大对象列如varchar(max)表格需要文字时TEXTIMAGE_ON [PRIMARY]

要确定文件组的名称,我使用系统表sys.filegroups和列name. 这将返回文件组的名称。在上面的例子中是PRIMARY.

但是,我正在编写脚本的其中一个表具有以下值:PRIMARY当表中没有 text、ntext、varchar(max) 等列时。因此,当脚本到达此表时,它会失败,因为TEXTIMAGE_ON不允许除非你有一个大的对象列。

为什么系统表中sys.filegroupsname不是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.filegroupsPRIMARY我添加到表脚本'TEXTIMAGE_ON [PRIMARY]`。

当我为此表运行脚本时,它会出错,因为除非有文本列、varchar(max) 等,否则不允许使用 TEXTIMAGE_ON 属性。

如果不需要,为什么要在系统表中设置属性?

4

0 回答 0