-1

SQL Server 2008 を使用して、テーブル a、テーブル b、およびテーブル c の 3 つのテーブルを作成します。

すべてにID列がありますが、テーブル a と b のID列は anidentity integerであり、テーブル c のID列はvarchar型です

現在、ストアド プロシージャは名前パラメーターを取得し、特定のロジックに従って、テーブル a またはテーブル b に挿入し、ID を取得し、接頭辞に 'A' または 'B' を付けてから、テーブル c に挿入します。

問題は、テーブル CIDの列に重複した値が含まれる可能性があることです。つまり、テーブル A の ID が 2 の場合、テーブル C の列に既に 'A2'、'A3'、'A5' が存在する可能性がありIDます。T-SQL の記述方法テーブル C で次に利用可能な値を特定するクエリを実行し、それに応じてテーブル A/B を更新しますか?

[更新] これが現在のステップです。1. 入力パラメータに応じて、テーブル A またはテーブル B に挿入します 2. 初期化シード値 = @@Identity 3. ID 値を計算して、接頭辞 'A' または追加 ' でテーブル C に挿入しますB' とシード値 4. ステップ 3 の ID 値でテーブル C 内の一致するレコードを探します。レコードが見つからない場合は挿入し、そうでない場合はシード値を 1 増やしてからステップ 3 を繰り返します。

問題は特定の値の範囲にあり、テーブル C ID に巨大な値のブロックが存在する可能性があります。つまり、A3000 から A500000 がテーブル C ID に存在し、既存のロジックに従う場合、データベース クエリは非常に遅くなります。利用可能な最小数を賢く取得するためのロジックを理解する必要があります (接頭辞なし)

説明するのは難しいです。これがより理にかなっていることを願っています。これについて何か助けていただければ幸いです。

4

2 に答える 2

1

これでうまくいくはずです。シンプルな自己抽出の例は、SSMS で機能します。念のため順不同にしました。テーブルを@Dataの場所に変更し、Identifierフィールドを変更して「ID」を置き換えます。

declare @Data Table ( Id varchar(3) );

insert into @Data values ('A5'),('A2'),('B1'),('A3'),('B2'),('A4'),('A1'),('A6');

With a as 
    (
    Select
        ID
    ,   cast(right(Id, len(Id)-1)  as int) as Pos
    ,   left(Id, 1) as TableFrom
    from @Data
    )
select
    TableFrom
,   max(Pos) + 1 as NextNumberUp
from a
group by TableFrom

編集:生産データについて心配したくない場合は、この最後の部分を追加して、私が書いたものを修正することができます:

Select
   TableFrom 
,  max(Pos) as LastPos
into #Temp
from a
group by TableFrom

select TableFrom, LastPos + 1
from #Temp

これが本番環境であったかどうかに関係なく、データを取得するために、ある時点でその一部にアクセスする必要があります。データセットが大きすぎず、varchar(256) 以下で 500 万行以下の場合、その列全体を tableC から一時テーブルにダンプできます。正直なところ、インポートに対するクエリのパフォーマンスは、システムごとに大きく異なります。

于 2013-04-11T21:09:43.220 に答える