2016-05-29 11 views
5

私はphp + mssqlを使用する比較的単純なウェブサイトを持っています。私は単純な挿入と削除の作業を行う様々なストアドプロシージャを持っています。私が直面している問題は、ストアドプロシージャに渡すパラメータの多くは、データを挿入する列と同じ長さです。SQL Serverのストアドプロシージャは、パラメータとしてvarchar maxを使用します。

たとえば、ユーザーを登録するストアドプロシージャがあります。ストアドプロシージャには、型としてvarchar(12)のパラメータを持つ@USERNAMEがあります。 USERテーブルの列番号USERNAMEは、その長さで同じタイプです。原則としてこれは実際問題ではありません。しかし、私はむしろストアドプロシージャのパラメータの長さを変更することなく、USERNAMEの列の長さを自由に変更することができます。

mssql phpドライバがテーブルのパラメータをサポートしていないため、このパラメータは使用できません。

私が想像できる唯一の解決策は、ストアドプロシージャのパラメータにvarchar(max)を使用することですが、これは悪い習慣と考えられますか?

+1

私の意見では、ストアドプロシージャのパラメータは、基になる列の型を反映する必要があります。これにより、実行時の切り捨てエラーが回避され、自己文書化ストアド・プロシージャ・インタフェースが提供されます。 –

+0

IMHOでは、フィールドの長さを制限しないでください。ディスク容量は安く、SQL Serverは高速であり、最も重要なことです。変更点 –

+1

バージョン管理用にパラメータSQLリソースIMOを使用するか、データベースの各フィールドにUDTを作成するかのどちらかです。テーブルとストアドprocsの両方に影響を与える定義を変更する必要があります – Mark

答えて

0

短い答え:はい。

誰かが2,147,483,647文字の長さのユーザー名を渡したとはどういう意味ですか? varchar(max)を使うと、それは大丈夫だろうということを意味しています。

@DanGuzmanのコメントと一致しています。テーブルの列のサイズを適切に決めてから、パラメタと変数のサイズを調整する必要があります。テーブルの列のサイズを変更する必要がある場合は、その変更を別の場所に伝える必要があります。これがベストプラクティスのアプローチです。

テーブルのサイズを正しく設定することは必ずしも容易ではありません。ユーザー名はどのくらいの長さにする必要がありますか? 12は私には不足しているようですが、2,147,483,647は間違いなく長すぎます - 間のどこかに? ;)@JohnCappellettiも有効なポイントを持っています - ストレージと処理は、変更のコストと比較して安価ですので、サイジング時に大きな面でエラーが発生します。

varchar(max)が悪い場合、ベストプラクティスに従うことを望まない場合は、中間地ですか?おそらく10倍の係数を使用するでしょうか?実際のサイズを十分上回っていますが、それほど余裕はありません。

注意すべき点は、パラメータのサイズに関係なく、サイレントトランケーションまたはランタイムトランケーションエラーです。長さを明示的にチェックしてください。

関連する問題