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 以下であるというドキュメントは間違っていますか、それとも私の解釈が間違っていますか?