【问题标题】:How to generate a new code如何生成新代码
【发布时间】:2012-10-03 23:48:45
【问题描述】:

使用 VB.Net 和 SQL Server

表1

Id             Value .....

1001P0010001   100
1001P0010002   200
1001P0010003   300
1001P0010004   400
...

我在table1 中有n 列和行,来自table1,我想用新的ID 复制所有列详细信息...

id no 是这样的1001P0020001, 1001P0020002, .......

P002 是下一个 ID,P003 是下一个 ID.....

前 4 位和后 4 位将保持从 table1 读取,中间 4 位应更改为下一个系列

预期输出

Id             Value .....

1001P0010001   100
1001P0010002   200
1001P0010003   300
1001P0010004   400
1001P0020001   100
1001P0020002   200
1001P0020003   300
1001P0020004   400
...

最好的方法是什么?

我可以在 VB.Net 或 SQL 查询中做到这一点...?请提出执行此操作的方法。

【问题讨论】:

  • 如果您在 VB.NET 中执行此操作,那么它将受到更多控制......

标签: sql sql-server vb.net sql-server-2000


【解决方案1】:
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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      相关资源
      最近更新 更多