Вот пример построчной обработки. Это предоставит вам результаты таким образом, чтобы вы могли обрабатывать каждую строку одновременно. Или вы можете использовать TableC в конце и выполнить любую необходимую вам обработку.
Однако было бы намного быстрее, если бы вы добавили дополнительный столбец в TableB (называемый TableA_ID) и просто вставили в него результат. У вас будет мгновенный доступ к TableA.ID и TableB.Identity. Но, не зная вашей точной ситуации, это может оказаться невозможным. (Но вы всегда можете добавить столбец, а затем отбросить его!)
USE tempdb
GO
CREATE TABLE TableA (
ID int NOT NULL PRIMARY KEY,
ColumnA varchar(10) NOT NULL,
ColumnB varchar(10) NOT NULL,
ColumnC varchar(10) NOT NULL
)
CREATE TABLE TableB (
[Identity] int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ColumnX varchar(30) NOT NULL
)
CREATE TABLE TableC (
TableA_ID int NOT NULL,
TableB_ID int NOT NULL,
PRIMARY KEY (TableA_ID, TableB_ID)
)
GO
INSERT INTO TableA VALUES (1, 'A', 'A', 'A')
INSERT INTO TableA VALUES (2, 'A', 'A', 'B')
INSERT INTO TableA VALUES (3, 'A', 'A', 'C')
INSERT INTO TableA VALUES (11, 'A', 'B', 'A')
INSERT INTO TableA VALUES (12, 'A', 'B', 'B')
INSERT INTO TableA VALUES (13, 'A', 'B', 'C')
INSERT INTO TableA VALUES (21, 'A', 'C', 'A')
INSERT INTO TableA VALUES (22, 'A', 'C', 'B')
INSERT INTO TableA VALUES (23, 'A', 'C', 'C')
GO
-- Do row-by-row processing to get the desired results
SET NOCOUNT ON
DECLARE @TableA_ID int
DECLARE @TableB_Identity int
DECLARE @ColumnX varchar(100)
SET @TableA_ID = 0
WHILE 1=1 BEGIN
-- Get the next row to process
SELECT TOP 1
@TableA_ID=ID,
@ColumnX = ColumnA + ColumnB + ColumnC
FROM TableA
WHERE ID > @TableA_ID
-- Check if we are all done
IF @@ROWCOUNT = 0
BREAK
-- Insert row into TableB
INSERT INTO TableB (ColumnX)
SELECT @ColumnX
-- Get the identity of the new row
SET @TableB_Identity = SCOPE_IDENTITY()
-- At this point, you have @TableA_ID and @TableB_Identity.
-- Go to town with whatever extra processing you need to do
INSERT INTO TableC (TableA_ID, TableB_ID)
SELECT @TableA_ID, @TableB_Identity
END
GO
SELECT * FROM TableC
GO
ВЫБРАТЬ * ИЗ ТАБЛИЦЫ A
ID ColumnA ColumnB ColumnC
----------- ---------- ---------- ----------
1 A A A
2 A A B
3 A A C
11 A B A
12 A B B
13 A B C
21 A C A
22 A C B
23 A C C
SELECT * FROM TableB
Identity ColumnX
----------- ------------------------------
1 AAA
2 AAB
3 AAC
4 ABA
5 ABB
6 ABC
7 ACA
8 ACB
9 ACC
ВЫБРАТЬ * ИЗ СТОЛБА C
TableA_ID TableB_ID
----------- -----------
1 1
2 2
3 3
11 4
12 5
13 6
21 7
22 8
23 9