【问题标题】:SQL Server Computed Column Error With Multiple Inserts [closed]多次插入的 SQL Server 计算列错误 [关闭]
【发布时间】: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


    【解决方案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')
    

    它有效。我错过了什么吗?

    【讨论】:

    • “不可重现”是一个有效的答案。我会投票关闭。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多