多个插入的SQL Server计算列错误

时间:2014-02-01 06:49:22

标签: sql-server calculated-columns default-constraint

我在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')

然后它会抛出一个错误:

  

Msg 537,Level 16,State 2,Line 1
  传递给LEFT或SUBSTRING函数的长度参数无效。

如果我删除默认约束或计算列(或两者),多行INSERT工作正常;但由于某些原因,同时使用约束和计算列会导致多行INSERT失败。我曾尝试以各种方式调整计算列以解释NULL(即使我认为它不应该考虑到评估的顺序),但似乎没有什么可以解决问题。

以前有人见过这样的事吗?

1 个答案:

答案 0 :(得分: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')

有效。我错过了什么吗?