2017-04-06 22 views
0

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型の値またはあまりにも多くの処理を占有せずに任意の一意の値を生成することができます方法についての提案がありますか?

答えて

0

ああ、私はそれを理解しました。私の想像した "数字です"という条件は、それが遠くに取り込まれたものではないことが分かります。 SQL Server 2008の時点で、ISNUMERIC機能があります。だから、varchar型のフィールドの次の最大の整数値のみのvarchar型の表現を取得するために、ここで私が今やっているものです:計算

select @NewRef = coalesce(max(ExternalRef), 0)+1 
from Merchants 
where PartnerID = @PartnerID 
    and ISNUMERIC(ExternRef) = 1 
+0

'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

+0

ありがとう@HABO、私はSQL Serverタグを追加しました。この質問はSQL Serverの特定のバージョンに関係しないので、私はバージョンタグについては決してわかりません。確かに、私たちが使っているバージョンはどの答えが役に立つのかを指示しますが、私はバージョンにとらわれない答えを期待していました。 TRY_CONVERT()については、おかげさしだしです。残念ながら、私たちのサーバー(2014年)では動作しません。問題のデータベースが互換モード100で動作していると思われます。理由はわかりませんが、変更するつもりはありません。私はDBAと一緒にそれを上げます。 –

0
  1. アドオンは、新しい列と列またはビューを持続 - ISNUMERIC決定的関数を使用しますCASECASTまたはSCHEMABINDINGでスカラー関数を使用すると

    alter table Merchants 
    add ExternRefNbr as (cast(case when isnumeric(ExternalRef) = 1 then ExternalRef end as int)) persisted 
    
  2. 新しいカラムにインデックスを作成する

  3. 使用カラム
+0

ISNUMERIC(ExternRef)= 1節をより効率的にするためのポイントは? –

関連する問題