0

两个问题:SQL SERVER 2012 我有一张表A (P_ID IDENTITY INT, P_Name CHAR(2), Cust_ID INT)

P_ID      P_Name   Cust_ID
547       08        1
147       2B        1
21        K4        2

我想通过在#Temp 表中创建自动生成的新 P_ID 和新 P_Name 来复制行。插入新行会自动生成 P_ID。

SELECT * INTO #Temp FROM TableA
INSERT INTO #Temp (P_Name, Cust_ID)
SELECT  SUBSTRING(REPLACE(CONVERT(VARCHAR(36), NEWID()) , '-', ''), 0, 3), Cust_ID FROM TableA

但我想确保新P_Name的是独一无二的。我怎样才能只填充 unique P_Names

我也有

TableB (P_ID, P_Name, Cust_ID, New_P_ID, New_P_Name)

如何填充TableB临时表中的所有记录以及 new_P_ID 和 new_P_Name 值?

4

1 回答 1

1

除非您想创建一个函数,否则我认为您需要使用基于光标的解决方案。

如果需要,我会先创建 TableB,然后将值从 TableB 复制到您的临时表。这个,或者您需要将主键从 TableA 添加到您的临时表,以便稍后在 TableB 中插入行时正确映射它。

以下代码可用于插入 TableB,但您需要为 New_P_ID 添加逻辑:

DECLARE cur CURSOR FOR SELECT P_ID, P_Name, cust_id FROM TableA
DECLARE @id int
DECLARE @name nchar(2)
DECLARE @cust_id int

OPEN cur

FETCH NEXT FROM cur INTO @id, @name, @cust_id

WHILE (@@FETCH_STATUS = 0)
BEGIN
    Select @id, @name, @cust_id

    -- Get a unique name, this will hang if all 
    -- names are taken...
    DECLARE @newName nchar(2)
    DECLARE @notUnique bit = 1
    WHILE (@notUnique = 1)
    BEGIN
        SET @newName = SUBSTRING(REPLACE(CONVERT(VARCHAR(36), NEWID()) , '-', ''), 0, 3)
        SELECT @notUnique = COUNT(*) FROM TableB where New_P_Name = @newName
    END

    -- TODO: Generate the New_P_ID here...
    DECLARE @new_p_id int = 42;

    INSERT INTO TableB(P_ID, P_Name, cust_id, New_P_ID, New_P_Name)
    VALUES (@id, @name, @cust_id, @new_p_id, @newName)

    FETCH NEXT FROM cur INTO @id, @name, @cust_id
END

CLOSE cur
DEALLOCATE cur
于 2013-05-02T08:23:44.777 回答