11桁の数値を格納するためにどのデータ型を使用する必要がありますか?最初の桁として「0」を格納する必要があります。
たとえば、02421402015
を格納する場合、02421402015
を表示する必要があります。 varchar
を使用してみたところ、2421402015
と表示されました。
数値をBIGINT
として保存し、単純に数値を好きなように表示することをお勧めします。
_DECLARE @Num BIGINT;
SET @Num = 2421402015;
SELECT CONVERT(VARCHAR(11), REPLICATE('0', 11 - LEN(@Num)))
+ CONVERT(VARCHAR(11), @Num);
_
Aaron Bertrand のコメントで指摘されているように、必要なゼロの文字列の長さを計算せず、単に文字列を切り捨てるほうがパフォーマンス面で優れています。
_SELECT RIGHT(REPLICATE('0', 11) + CONVERT(VARCHAR(11), @Num), 11);
_
サンプル番号の場合、連結の結果は「000000000002421402015」になり、11桁に右に切り捨てられます。
_02421402015
_
実際、 srutzky が指摘しているように、これはさらに最適化して次のようにすることができます。
_SELECT RIGHT('00000000000' + CONVERT(VARCHAR(11), @Num), 11);
_
ユーザーがWHERE
句で一致させる必要のある先行ゼロを含む値を渡す場合、最初に検索語を整数に変換し、それを述語で使用して、インデックスを使用できるようにします。
ブログ投稿しました1 これは、数値を整数として格納する方法を詳しく説明すると同時に、数値に先行ゼロを付けてデータベースに格納されているように見せるエレガントな方法を提供します。詳細は http://www.sqlserver.science/basics/how-do-i-store-a-number-with-leading-zeros/ を確認してください!先頭のゼロの列をフォーマットする方法は他にもいくつかありますが、 各メソッドのパフォーマンスはさまざまです 非常に劇的です。 RIGHT('00000000000' + CONVERT(VARCHAR(11), @Num), 11)
メソッドは、最速のように見えます。
1-私のブログ投稿は SQL PASS Community Connector News で紹介されました
2- Follow up post SQL Server 2012以降でのFORMATMESSAGE()
関数のパフォーマンスについて
あなたの質問であなたが言っていることが真実ではないことを示すために:
_DECLARE @x TABLE(y VARCHAR(11));
INSERT @x(y) VALUES('02421402015');
SELECT y FROM @x;
_
結果:
_y
-----------
02421402015
_
私たちはあなたの問題をよりよく理解できるように、何が起こっているのかについてより詳細に教えてください。
ただし、最も重要なのは、ストレージをプレゼンテーションから分離することを検討する必要があることです。 varchar(11)
(11バイト+長さを示す2バイト)ではなく、int
(4バイト)またはbigint
(8バイト)として数値を格納する方がはるかに効率的です。検証(つまり、誰かが数値の代わりに_I'm varchar
_を格納できない)、算術などで、暗黙的または明示的な変換が必要になることなく。表示用の先頭の_0
_をプレゼンテーション層に追加するのは簡単ですが、本当に必要な場合はクエリ時にSQL Serverに追加することもできます。また、受信した検索条件を追加または削除して、ユーザーが検索および表示している内容に関係なく、適切なパラメーター型を使用して、適切で最も効率的なデータ型に対して検索することも簡単です...