T-SQLデータベースで実行されているシステムで、かなりユニークな要求が発生しました。私は、その最も基本的な形で次のようになり、テーブルを持っている:VARCHARフィールドの次の最大値または次の一意の値
create table Merchants (
ID int not null identity(1,1) primary key,
PartnerID int,
ExternalRef varchar(10),
Name varchar(MAX)
)
ExternalRef
たちは、外部の当事者のうちの1つによって提供される参照番号を運ぶするvarchar(10)
フィールドです。そのため、PartnerID
値によって定義された範囲内で一意的なものに過ぎません。
私が今問題にしているのは、あるパートナーが私たちに提供できる価値を持っておらず、それらの価値を生み出そうとしているということです。それだけで十分です。増分する整数値を使用して、それらをvarcharに変換することができます。したがって、新しい値を割り当てる前に、単にselect max(ExternalRef) where PartnerID = @PartnerID
を実行して整数に変換し、値に1を加えてvarcharに戻します。実際には、DBMSは、暗黙のうちにその変換の全てを行いますと、このような何かが正常に動作する必要があります:
select @NewRef = max(ExternalRef)+1
from Merchants
where PartnerID = @PartnerID
をしかし、私の懸念は、そのパートナーのための値のいずれかが英数字の値であり、によって返されるどのような場合には、ありますselect max(ExternalRef)
電話をかけますか?上記のアプローチは明らかに醜い方法で失敗し、英数字の文字列を "インクリメント"する方法は認識していません。
したがって、テーブルにまだ存在しない一意のvarchar(10)
の値を思いつく方法が必要です。私はランダムな値を生成し、それが既にテーブルに入っているかどうかを確認し、それが繰り返されているかどうかを確認することができますが、そのアプローチについても気にしません。私がwhere
節で数値だけの値に結果を制限するために使うことができるものがあれば、それもうまくいっていますが、それを行うためのエレガントな方法は考えられません。ような何か:
select @NewRef = coalesce(max(ExternalRef), 0)+1
from Merchants
where PartnerID = @PartnerID
and ExternRef is numeric
は、誰も私がフィールド上に「次の最大の」varchar型の値またはあまりにも多くの処理を占有せずに任意の一意の値を生成することができます方法についての提案がありますか?
'IsNumeric関数()'、専門用語を使用すること、である[hinky(http://sqlinthewild.co.za/index.php/2011/07/26/goodbye-isnumeric-hell /)。代わりに 'Try_Parse()'や 'Try_Convert()'を見たいかもしれません。ヒント:適切なソフトウェア(MySQL、Oracle、DB2など)とバージョンの両方でデータベースの質問にタグを付けると便利です。 'sql-server-2014'です。構文と機能の相違は、しばしば答えに影響します。 – HABO
ありがとう@HABO、私はSQL Serverタグを追加しました。この質問はSQL Serverの特定のバージョンに関係しないので、私はバージョンタグについては決してわかりません。確かに、私たちが使っているバージョンはどの答えが役に立つのかを指示しますが、私はバージョンにとらわれない答えを期待していました。 TRY_CONVERT()については、おかげさしだしです。残念ながら、私たちのサーバー(2014年)では動作しません。問題のデータベースが互換モード100で動作していると思われます。理由はわかりませんが、変更するつもりはありません。私はDBAと一緒にそれを上げます。 –