-1

使用SQL Server 2008,有三个表,表a、表b和表c。

都有一ID列,但对于表 a 和 bID列是 a identity integer,对于表 cID列是一个varchar类型

目前,存储过程采用名称参数,遵循一定的逻辑,插入表 a 或表 b,获取标识,以“A”或“B”为前缀,然后插入表 c。

问题是,表CID列可能有重复值,即如果表A的标识为2,表C的列中可能已经有'A2','A3','A5' ID,如何编写T-SQL查询以识别表 C 中的下一个可用值,然后确保相应地更新表 A/B?

[更新]这是当前步骤,1.取决于输入参数,插入表A或表B 2.初始化种子值=@@Identity 3.计算ID值以通过前缀'A'或附加'插入表C B' 与种子值 4. 在表 C 中通过步骤 3 中的 ID 值查找记录匹配,如果没有找到任何记录,则插入它,否则将种子值增加 1,然后重复步骤 3

问题是在一定的取值范围内,C表ID中可能存在一个巨大的值块,即表C ID中现在存在A3000到A500000,按照现有逻辑查询数据库速度极慢。需要找出一个逻辑来巧妙地获得最小可用号码(不带前缀)

很难描述,希望这更有意义,我真的很感谢任何帮助提前谢谢!

4

2 回答 2

1

这应该可以解决问题。简单的自提取示例将在 SSMS 中工作。为了以防万一,我什至把它弄坏了。您只需将表更改为@Data 所在的位置,然后更改标识符字段以替换“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 回答
1

考虑到 A 和 B 是唯一的,按照您的设计,表 C 中不应有任何重复项。

A | B | C
1   1   A1
2   2   A2
        B1
        B2
于 2013-04-11T20:49:07.713 回答