我在SQL Server 2008中有一个表格 - 我们调用表mytable。该表的列名为状态,该列不是计算的列,并且定义为Varchar(40),并且允许nulls;但是,此列上还有默认约束,默认值='pool'。我刚刚在表中添加了一个计算的列,使用以下内容:
ALTER TABLE MyTable
ADD PrimaryStatus AS
CASE
WHEN Status LIKE '%/%' THEN LEFT(Status,CHARINDEX('/', Status) - 1)
ELSE Status
END PERSISTED
如果我一一将记录插入表中(并使用Status
使用约束默认为"池"),则可以正常工作;例如,此SQL语句没有问题:
INSERT INTO MyTable (Name) VALUES ('Foo')
使用上述SQL,我最终在表中获得了名称='foo'和status ='pool''和primarystatus ='pool'
的新记录但是,如果我执行多行插入,则如下:
INSERT INTO MyTable (Name) VALUES ('Foo'),('Bar')
然后引发错误:
msg 537,第16级,状态2,第1行
无效的长度参数传递到左或子字符串函数。
如果我放下默认约束或计算列(或两者),则多行INSERT
工作正常;但是由于某种原因,具有约束和计算列的同时导致多行INSERT
失败。我尝试通过多种方法来调整计算的列来说明零(即使我认为在评估顺序下不应该重要),但似乎没有任何解决问题。
有人以前见过这样的东西吗?
我试图复制错误。但是,我没有任何错误。我本可以将其添加为评论,但还没有足够的积分。无论如何,这就是我所做的 -
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')
它有效。我想念什么吗?