2012-10-13 110 views
0

使用VB.Net和SQL Server如何產生一個新的代碼

表1

Id    Value ..... 

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

我有n列和行table1,從table1,我想用複製所有列細節新的ID沒有......

編號是這樣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查詢中做到這一點......?請建議如何做到這一點。

+0

如果您在VB.NET做它,然後它會在更多的控制........ – andy

回答

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+'%'[email protected] 
     ) x 
    ) y 
WHERE y.RowNum=1; 

SELECT @LastGeneratedMiddleValue = ISNULL(@LastGeneratedMiddleValue ,0) 
SELECT @Prefix 
     +RIGHT('00'+CONVERT(VARCHAR(3),@LastGeneratedMiddleValue +1),3) 
     [email protected] 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 
0
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