0

我在 SQL Server 2008 中有一个表 - 我们将表称为 MyTable。该表有一个名为 Status 的列,它不是计算列,定义为 varchar(40),它允许 NULL;但是,此列上还有一个 DEFAULT CONSTRAINT,默认值 = 'POOL'。我刚刚使用以下命令向表中添加了一个计算列:

ALTER TABLE MyTable 
ADD PrimaryStatus AS 
    CASE 
       WHEN Status LIKE '%/%' THEN LEFT(Status,CHARINDEX('/', Status) - 1) 
       ELSE Status 
    END PERSISTED

如果我将记录一一插入表中(并Status使用约束默认为“POOL”),它就可以正常工作;例如,这条 SQL 语句没有问题:

INSERT INTO MyTable (Name) VALUES ('Foo')

使用上面的 SQL,我最终在表中创建了一条新记录,其中 Name = 'Foo' 和 Status = 'POOL' 和 PrimaryStatus = 'POOL'

但是,如果我执行如下所示的多行 INSERT:

INSERT INTO MyTable (Name) VALUES ('Foo'),('Bar')

然后它抛出一个错误:

消息 537,级别 16,状态 2,第 1 行
传递给 LEFT 或 SUBSTRING 函数的长度参数无效。

如果我删除默认约束或计算列(或两者),多行INSERT工作正​​常;但由于某种原因,同时具有约束和计算列导致多行INSERT失败。我尝试以各种方式调整计算列来解释 NULL(尽管我认为考虑到评估的顺序并不重要),但似乎没有什么可以解决这个问题。

以前有人见过这样的东西吗?

4

1 回答 1

1

我试图复制错误。但是,我没有得到任何错误。我本可以将此添加为评论,但还没有足够的积分。无论如何,这就是我所做的 -

CREATE TABLE [dbo].[MyTable](
    [Name] [varchar](50) NULL,
    [Status] [varchar](50) NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[MyTable] ADD  CONSTRAINT [DF_MyTable_Status]  
DEFAULT ('POOL') FOR [Status]
GO

然后我在你的代码中删除了一个额外的 ) 并做了 -

ALTER TABLE MyTable ADD PrimaryStatus AS 
CASE WHEN Status LIKE '%/%' THEN LEFT(Status,CHARINDEX('/',Status)-1) 
ELSE Status END PERSISTED

其次是 -

INSERT INTO MyTable (Name) VALUES ('Foo')
INSERT INTO MyTable (Name) VALUES ('Foo'),('Bar')

有用。我错过了什么吗?

于 2014-02-01T07:16:01.993 回答