1

这是 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

这在几天前有效,并且已经工作了一年多。

然后昨天,我在使用没有的值插入或更新时开始收到此错误identifierno [,当预期结果为 NULL 时:

Invalid length parameter passed to the left function.

现在,今天,它又开始工作了。

如果不正确,为什么 SQL Server 会尝试解决该LEFT()函数?CASE

更重要的是,为什么它在一天工作而不是下一天工作?

我昨天还创建了一些索引视图,尽管没有涵盖这些列中的任何一个。索引视图所需的 SET 选项之一是否会导致数据库开始为这样的表达式抛出错误?

4

1 回答 1

0

我会用

N'[^[]%\[%]' escape N'\'  

这应该处理第一个字符是 [.

或者,如果您想在这种情况下返回一个非 null(空字符串?),请使用嵌套 CASE 来处理 CHARINDEX 返回 1 的条件。

顺便说一句,你真的不需要那个转义字符或转义子句。您可以使用 [[] 来匹配 [ 字符:

N'[^[]%[[]%]'

但是,这是个人品味的问题。我可以看到转义版本如何更清晰一些

于 2011-10-28T18:42:05.687 回答