0

SSMS バージョン 2008 での SUBSTRING の理解を確認していました。

start_expression が 0 ベースなのか 1 ベースなのかわかりませんでしたし、0 ベースなら start_expression の 0 を許可する意味がわかりませんでした。

クエリを実行しました。

DECLARE @Test VARCHAR(5) = 'Hello'

SELECT @Test, SUBSTRING(@Test, 1, 4), 'What the ' + SUBSTRING(@Test, 0, 5) + '?',  + SUBSTRING(@Test, -1, 6)

結果を出した;

ハローヘル なんてこった?地獄

現在、SQL Server 2008 BOL は次のように述べています。

start_expression 返される文字の開始位置を指定する整数式または bigint 式です。start_expression が 0 より小さい場合、エラーが生成され、ステートメントが終了します。start_expression が値式の文字数より大きい場合、長さゼロの式が返されます。

2008R2 または 2012 のさらに新しいバージョンが示しています。

start_expression が 1 未満の場合、返される式は、value_expression で指定された最初の文字から始まります。

それでも、上記の SQL ステートメントの最後の列では、-1 から開始して 6 文字を抽出できます。

これを試したサーバーは両方とも 2008 R2 を実行していました (一方 (SP2) - 10.50.4000.0 (X64)、もう一方の R2 (RTM) - 10.50.1600.1 (X64))

だから私の質問は - SSMS を介して実行される SQL のバージョンを決定するものは何ですか? それはSSMSバージョン自体、データベースサーバー、データベースですか(これを実行したデータベースの1つは、2005互換モードの2008サーバー上にありました)?

また、開始位置が 0 以下であるというドキュメントは間違っていますか、それとも私の解釈が間違っていますか?

4

1 に答える 1

2

接続しているデータベース サーバーのバージョンが重要です。クエリを解釈して実行するのはサーバーです。

ドキュメントに関しては、SQL Server 2008 R2 および SQL Server 2012 で修正された混乱があったようです。

質問にあるドキュメントからの引用が見つかりませんが、SQL Server 2008 でこれが見つかり、返される文字数の説明が間違っていますが、負の値を指定しない限り、エラーを生成する必要があることはどこにもわかりません長さとしての値。


SQL Server 2008 サブストリング (Transact-SQL)

start_expression が 1 未満の場合、返される式は、value_expression で指定された最初の文字から始まります。この場合、返される文字数は、start_expression と length_expression の合計または 0 のいずれかの最大値です。


SQL Server 2008 R2 サブストリング (Transact-SQL)

start_expression が 1 未満の場合、返される式は、value_expression で指定された最初の文字から始まります。この場合、返される文字数は、start_expression + length_expression の合計 – 1 または 0 のいずれかの最大値です。


SQL Server 2012 サブストリング (Transact-SQL)

start が 1 未満の場合、返される式は式で指定された最初の文字から始まります。この場合、返される文字数は、start + length-1 または 0 の合計のいずれかの最大値です。

于 2013-09-10T05:47:00.063 に答える