Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server计算列错误,包含多个插入_Sql Server_Calculated Columns_Default Constraint - Fatal编程技术网

Sql server SQL Server计算列错误,包含多个插入

Sql server SQL Server计算列错误,包含多个插入,sql-server,calculated-columns,default-constraint,Sql Server,Calculated Columns,Default Constraint,我在SQLServer2008中有一个表——我们将该表称为MyTable。该表有一个名为Status的列,该列不是计算列,定义为varchar(40),它允许空值;但是,此列上还有一个默认约束,默认值为'POOL'。我刚刚使用以下命令向表中添加了一个计算列: ALTER TABLE MyTable ADD PrimaryStatus AS CASE WHEN Status LIKE '%/%' THEN LEFT(Status,CHARINDEX('/', Statu

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

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'),('Bar')
如果我一个接一个地将记录插入表中(并使用约束将
Status
默认设置为'POOL',它就可以正常工作;例如,此SQL语句没有问题:

INSERT INTO MyTable (Name) VALUES ('Foo')
使用上述SQL,我在表中得到一条新记录,其名称为'Foo',状态为'POOL',PrimaryStatus为'POOL'

但如果我执行多行插入,如下所示:

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'),('Bar')
然后它抛出一个错误:

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

如果我删除默认约束或计算列(或两者),则多行
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')
它起作用了。我遗漏了什么吗?

“不可复制”是一个正确的答案。我将投票结束。