0

2 つの質問: 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

自動生成された新しい P_ID と新しい P_Name を #Temp テーブルに作成して、行を複製したいと考えています。新しい行を挿入すると、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 から一時テーブルに値をコピーします。または、後で TableB に行を挿入するときに正しくマップするために、TableA の主キーを一時テーブルに追加する必要があります。

次のコードを使用して 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 に答える