这是SQL Server 2005中带有计算列的表:
CREATE TABLE footable AS
[identifier] nvarchar(255) NOT NULL,
[result] AS CASE
WHEN [identifier] like '%\[%]' escape '\'
THEN LEFT( [identifier], CHARINDEX('[',[identifier]) - 1 )
END
这就是我所期待的:
identifier result
======================
foo[bar] foo
foo NULL
这在几天前就开始工作,并且已经工作了一年多。
然后昨天,当插入或更新identifier
没有[
的值时,我开始收到此错误,当NULL为预期结果时:
Invalid length parameter passed to the left function.
现在,今天它再次运作。
当LEFT()
不正确时,为什么SQL Server会尝试解析CASE
函数?
更重要的是,为什么它有一天工作而不是下一天?
我昨天也创建了一些索引视图,但没有涵盖这些列中的任何一个。索引视图所需的SET选项之一是否会导致数据库开始为这样的表达式抛出错误?
答案 0 :(得分:0)
我会用
N'[^[]%\[%]' escape N'\'
那应该处理第一个字符是[。
的可能性或者,如果你想在这种情况下返回一个非null(空字符串?),使用嵌套的CASE来处理CHARINDEX返回1的条件。
顺便说一下,你真的不需要那个转义字符或转义子句。您可以使用[[]匹配[character:
N'[^[]%[[]%]'
但是,这是个人品味的问题。我可以看到转义版本是如何更清晰