【发布时间】:2014-02-01 06:49:21
【问题描述】:
我在 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(尽管我认为考虑到评估的顺序并不重要),但似乎没有什么可以解决这个问题。
有人见过这样的吗?
【问题讨论】:
标签: sql-server calculated-columns default-constraint