Sql 如何生成新代码

Sql 如何生成新代码,sql,sql-server,vb.net,sql-server-2000,Sql,Sql Server,Vb.net,Sql Server 2000,使用VB.Net和sqlserver 表1 Id Value ..... 1001P0010001 100 1001P0010002 200 1001P0010003 300 1001P0010004 400 ... 我在表1中有n列和行,我想从表1中复制所有列的详细信息以及新的id号 id号是这样的1001P0002001,1001P0002002,… P002是下一个id,P003是下一个id 前4位和后4位将保持为表1中的读数,中间4位应更改为下

使用VB.Net和sqlserver

表1

Id             Value .....

1001P0010001   100
1001P0010002   200
1001P0010003   300
1001P0010004   400
...
我在
表1
中有n列和行,我想从
表1
中复制所有列的详细信息以及新的id号

id号是这样的
1001P0002001,1001P0002002,…

P002
是下一个id,
P003
是下一个id

前4位和后4位将保持为表1中的读数,中间4位应更改为下一系列

预期产量

Id             Value .....

1001P0010001   100
1001P0010002   200
1001P0010003   300
1001P0010004   400
1001P0020001   100
1001P0020002   200
1001P0020003   300
1001P0020004   400
...
哪种方法最好


我可以在VB.Net或SQL查询中完成。。。?请建议执行此操作的方法。

如果您在VB.NET中执行此操作,则它将处于更多控制中。。。。。。。。
insert into table1 (id, value)
select 
    l +
    replicate('0', 3 - lenght(m)) + m +
    r,
    value
from (
    select 
        left(id, 5) l,
        cast(cast(substring(id, 6, 3) as integer) + 1 as varchar(3)) m,
        right(id, 4),
        value
    from table1
) s
CREATE TABLE CocoJambo (
    Id  CHAR(12) NOT NULL,
    Value INT NULL,
    CHECK( Id LIKE '[0-9][0-9][0-9][0-9][A-Z][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' )
);
GO

CREATE UNIQUE INDEX IUN_CocoJambo_Id
ON CocoJambo (Id);
GO

INSERT  CocoJambo (Id, Value)
          SELECT '1001P0010001', 100
UNION ALL SELECT '1001P0010002', 200
UNION ALL SELECT '1001P0010003', 300
UNION ALL SELECT '1001P0010004', 400
UNION ALL SELECT '1001P0020001', 100
UNION ALL SELECT '1001P0020002', 200
UNION ALL SELECT '1001P0020003', 300
UNION ALL SELECT '1001P0020004', 400;
GO

-- Test 1: generating a single Id
DECLARE @Prefix CHAR(5),
        @Sufix CHAR(4);
SELECT  @Prefix = '1001P',
        @Sufix = '0001';

BEGIN TRAN

DECLARE @LastGeneratedMiddleValue  INT,
        @LastValue INT;

SELECT  @LastGeneratedMiddleValue = y.MiddleValue,
        @LastValue = y.Value
FROM 
    (
    SELECT  x.MiddleValue, x.Value,
            ROW_NUMBER() OVER(ORDER BY x.MiddleValue DESC) AS RowNum
    FROM 
        (
        SELECT  CONVERT(INT,SUBSTRING(a.Id,6,3)) AS MiddleValue, a.Value
        FROM    CocoJambo a WITH(UPDLOCK) -- It will lock the rows (U lock) during transaction
        WHERE   a.Id LIKE @Prefix+'%'+@Sufix
        ) x
    ) y
WHERE   y.RowNum=1;

SELECT  @LastGeneratedMiddleValue  = ISNULL(@LastGeneratedMiddleValue ,0)
SELECT  @Prefix
        +RIGHT('00'+CONVERT(VARCHAR(3),@LastGeneratedMiddleValue +1),3)
        +@Sufix AS MyNewId,
        @LastValue AS Value

COMMIT TRAN;
GO

-- Test 2: generating many Id's
BEGIN TRAN

DECLARE @Results TABLE (
    Prefix CHAR(5) NOT NULL,
    Sufix CHAR(4) NOT NULL,
    LastGeneratedMiddleValue  INT NOT NULL,
    LastValue INT NULL
);
INSERT  @Results (Prefix, Sufix, LastGeneratedMiddleValue, LastValue)
SELECT  y.Prefix, y.Sufix, y.MiddleValue, y.Value
FROM 
    (
    SELECT  x.Prefix, x.MiddleValue, x.Sufix, x.Value,
            ROW_NUMBER() OVER(PARTITION BY x.Prefix, x.Sufix ORDER BY x.MiddleValue DESC) AS RowNum
    FROM 
        (
        SELECT  SUBSTRING(a.Id,1,5) AS Prefix,
                CONVERT(INT,SUBSTRING(a.Id,6,3)) AS MiddleValue,
                SUBSTRING(a.Id,9,4) AS Sufix,
                a.Value
        FROM    CocoJambo a WITH(UPDLOCK) -- It will lock the rows (U lock) during transaction
        ) x
    ) y
WHERE   y.RowNum=1;

SELECT  r.*, 
        r.Prefix
        +RIGHT('00'+CONVERT(VARCHAR(3),r.LastGeneratedMiddleValue +1),3)
        +r.Sufix AS MyNewId,
        r.LastValue AS Value
FROM    @Results r;

COMMIT TRAN;
GO