通过SQL Server数据库项目发布操作在数据库中填充字段时,我们发现了一个非常奇怪的问题。
这是表格定义
CREATE TABLE [dbo].[CatalogueItemExtensionFields]
(
[RowID] tinyint identity not null,
[FieldType] tinyint not null,
[Description] varchar(120) not null,
[Nullable] bit not null,
[DefaultValue] varchar(100) null,
[Active_Flag] bit null,
[OrderPriority] tinyint not null,
[ContextGuid] uniqueidentifier not null
);
这是人口脚本
set identity_insert CatalogueItemExtensionFields on
INSERT INTO CatalogueItemExtensionFields (rowid, fieldtype, description, nullable, defaultvalue, active_flag, orderpriority)
VALUES (dbo.ConstantProductGroupRowId(), 3, 'Product Group', 0, '', 1, dbo.ConstantProductGroupRowId()),
set identity_insert CatalogueItemExtensionFields off
如果我手动运行INSERT
脚本,一切正常。当我将其作为DB项目发布的一部分运行时,它会插入" 0"。
我查看了生成的publish.sql
脚本,看起来都很好。
BTW,我发现的唯一类似帖子是this,但它不适用于我们的情况,因为我们插入的字段被定义为varchar。
这让我们很生气。有什么想法吗?
答案 0 :(得分:0)
APOLOGIES - 我的错误! (但是非常有用的文档)
我在下面再次总结(也是为了让我更清楚地尊重我的初始职位)
表定义
CREATE TABLE [dbo].[CatalogueItemExtensionFields]
(
[RowID] tinyint identity not null,
[FieldType] tinyint not null,
[Description] varchar(120) not null,
[Nullable] bit not null,
[DefaultValue] varchar(100) null,
[Active_Flag] bit null,
[OrderPriority] tinyint not null
);
INSERT STATEMENT
set identity_insert CatalogueItemExtensionFields on
INSERT INTO CatalogueItemExtensionFields (rowid, fieldtype, description, nullable, defaultvalue, active_flag, orderpriority) VALUES
(6, 3, N'Product Group', 0, N'', 1, 6),
(7, 2, N'Minimum Order Quantity', 1, NULL, 1, 7),
(8, 3, N'Additional HIBCs', 0, 1, 1, 8),
(9, 3, N'Additional GTINs', 0, N'', 1, 9)
set identity_insert CatalogueItemExtensionFields off
因为我正在插入多行,所以当SQL解析语句时,它会看到我试图为RowID = 8插入一个数值defaultvalue = 1.因此,即使该列被定义为varchar,SQL也会决定INSERT语句正在插入INT。因此空字符串值(对于RowID 7和9)将转换为零。我提到了我发现的与actual INT column相关的帖子,这导致了相同的行为。
如果我改为运行以下语句,RowID = 8的默认值为“1”,则一切正常。
INSERT INTO CatalogueItemExtensionFields (rowid, fieldtype, description, nullable, defaultvalue, active_flag, orderpriority) VALUES
(6, 3, N'Product Group', 0, N'', 1, 6),
(7, 2, N'Minimum Order Quantity', 1, NULL, 1, 7),
(8, 3, N'Additional HIBCs', 0, '1', 1, 8),
(9, 3, N'Additional GTINs', 0, N'', 1, 9)
那么,现在的问题是,为什么SQL服务器会忽略列类型定义,而是从我的INSERT语句中的值中确定类型?
答案 1 :(得分:0)
“空字符串无错误地转换为int,其值为零。它与隐式转换的可能性有关”