このフォーラムのディスカッションによると、SQL Server(2005を使用していますが、これは2000と2008にも適用されます)varchar
は、ストアドプロシージャパラメータとして指定した文字列をvarcharの長さにサイレントに切り捨てます。ただし、INSERT
実際にはエラーが発生します。例えば。このテーブルを作成する場合:
CREATE TABLE testTable(
[testStringField] [nvarchar](5) NOT NULL
)
次に、以下を実行すると、次のようになります。
INSERT INTO testTable(testStringField) VALUES(N'string which is too long')
エラーが発生します:
String or binary data would be truncated.
The statement has been terminated.
素晴らしい。データの整合性は維持され、呼び出し元はそれを知っています。次に、それを挿入するためのストアドプロシージャを定義しましょう。
CREATE PROCEDURE spTestTableInsert
@testStringField [nvarchar](5)
AS
INSERT INTO testTable(testStringField) VALUES(@testStringField)
GO
そしてそれを実行します:
EXEC spTestTableInsert @testStringField = N'string which is too long'
エラーなし、1行が影響を受けます。testStringField
'strin'として行がテーブルに挿入されます。SQL Serverは、ストアドプロシージャのvarchar
パラメータをサイレントに切り捨てました。
さて、この振る舞いは時々便利かもしれませんが、私はそれをオフにする方法がないことを収集します。ストアドプロシージャに長すぎる文字列を渡すとエラーが発生するため、これは非常に面倒です。これに対処するには2つの方法があるようです。
まず、ストアドプロシージャの@testStringField
パラメータをサイズ6として宣言し、その長さが5を超えているかどうかを確認します。これはちょっとしたハックのようで、刺激的な量の定型コードが含まれます。
次に、すべてのストアドプロシージャのvarcharパラメータをであるvarchar(max)
と宣言INSERT
し、ストアドプロシージャ内のステートメントを失敗させます。
後者は正常に機能しているように見えるので、私の質問は次のとおりですvarchar(max)
。長すぎる文字列が渡されたときに実際にストアドプロシージャを失敗させたい場合は、SQL Serverストアドプロシージャの文字列に常に使用することをお勧めしますか?それもベストプラクティスでしょうか?無効にできないサイレント切り捨ては、私にはばかげているようです。