我在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(即使我认为它不应该考虑到评估的顺序),但似乎没有什么可以解决问题。
以前有人见过这样的事吗?
答案 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')
有效。我错过了什么吗?