1

SQLServer2005の計算列の表は次のとおりです。

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

これは数日前に機能し、1年以上機能しています。

それから昨日、NULLが期待される結果になるときに、identifierがない値を挿入または更新すると、このエラーが発生し始めました。[

Invalid length parameter passed to the left function.

さて、今日、それは再び働いています。

が真でないのに、SQL ServerがLEFT()関数を解決しようとするのはなぜですか?CASE

さらに重要なのは、なぜそれが次の日ではなく、ある日機能しているのでしょうか。

昨日、これらの列のどちらもカバーしていませんでしたが、いくつかのインデックス付きビューを作成していました。ビューのインデックス作成に必要なSETオプションの1つにより、データベースがこのような式のエラーをスローし始める可能性がありますか?

4

1 に答える 1

0

私は使うだろう

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

最初の文字が [ である可能性を処理する必要があります。

または、その場合に非 null (空の文字列?) を返したい場合は、ネストされた CASE を使用して、1 を返す CHARINDEX の条件を処理します。

ところで、そのエスケープ文字やエスケープ句は実際には必要ありません。[[] を使用して [ 文字に一致させることができます。

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

でも、それは個人の好みの問題です。エスケープされたバージョンが少し明確になっていることがわかります

于 2011-10-28T18:42:05.687 に答える