Как вставить переменную таблицы в таблицу со столбцом идентификаторов при обновлении идентификатора переменной таблицы? - PullRequest
0 голосов
/ 28 января 2011

Я пишу SQL-скрипт для генерации тестовых данных для нашей базы данных.Я генерирую данные в табличных переменных (чтобы я мог отслеживать их позже), а затем вставляю их в реальные таблицы.Проблема в том, что мне нужно отследить, какие строки я добавил в родительскую таблицу, чтобы потом можно было генерировать ее дочерние данные в скрипте.Например:

CREATE TABLE Customer (
    CustomerId INT IDENTITY,
    Name       VARCHAR(50)
)

CREATE TABLE Order (
    OrderId    INT IDENTITY,
    CustomerId INT,
    Product    VARCHAR(50)
)

Итак, в моем скрипте я создаю эквивалентные переменные таблицы:

DECLARE @Customer TABLE (
    CustomerId INT IDENTITY,
    Name       VARCHAR(50)
) -- populate customers

DECLARE @Order TABLE (
    OrderId    INT IDENTITY,
    CustomerId INT,
    Product    VARCHAR(50)
) -- populate orders

И я генерирую и вставляю примеры данных в каждую переменную таблицы.

Теперь, когда я собираюсь вставить клиентов из моей табличной переменной в реальную таблицу, столбец CustomerId в переменной таблицы станет бессмысленным, поскольку у реальной таблицы есть свой собственный идентификатор для ее столбца CustomerId.

Есть ли способ, которым я могу отследить новый идентификатор каждой строки, вставленной в реальную таблицу, в моей табличной переменной, чтобы я мог использовать правильный CustomerId для записей заказа?Или есть ли лучший способ, которым я должен идти об этом?

(Примечание: я изначально запустил приложение для генерации тестовых данных, но оно работало слишком медленно во время вставки, так как нужно сгенерировать> 1 000 000 записей.)

Ответы [ 4 ]

2 голосов
/ 28 января 2011

Зачем вам нужны значения идентификаторов в табличных переменных?Если вы используете просто int, вы можете идентифицировать идентификаторы после завершения вставки.Возьмите их, используя предложение вывода.Вам могут понадобиться переменные входных значений и таблицы выходных значений, чтобы получить это правильно, как это:

0 голосов
/ 28 января 2011

Вот один из способов сделать это.Если вы можете использовать это зависит от вашей ситуации.Вы не должны делать это в производственной среде, когда пользователи используют вашу базу данных.

-- Get the next identity values for Customer and Order
declare @NextCustomerID int
declare @NextOrderID int
set @NextCustomerID = IDENT_CURRENT('Customer')+1
set @NextOrderID = IDENT_CURRENT('Order')+1

-- Create tmp tables
create table #Customer (CustomerID int identity, Name varchar(50))
create table #Order (OrderID int identity, CustomerID int, Product varchar(50))

-- Reseed the identity columns in temp tables
dbcc checkident(#Customer, reseed, @NextCustomerID) 
dbcc checkident(#Order, reseed, @NextOrderID) 

-- Populate #Customer
-- Populate #Order

-- Allow insert to identity column on Customer
set identity_insert Customer on

-- Add rows to Customer
insert into Customer(CustomerId, Name)
select CustomerID, Name
from #Customer

-- Restore identity functionality on Customer
set identity_insert Customer off

-- Add rows to Order
set identity_insert [Order] on
insert into [Order](OrderID, CustomerID, Product)
select OrderID, CustomerID, Product
from #Order
set identity_insert [Order] off

-- Drop temp tables
drop table #Customer
drop table #Order

-- Check result
select * from [Order]
select * from Customer
0 голосов
/ 28 января 2011

Первый способ получить MAX(CustomerId) из вашей таблицы клиентов.Затем я избавился бы от столбца IDENTITY в таблице переменных и сделал бы свой собственный CustomerId, используя ROW_NUMBER() и MaxCustomerId.Это должно быть примерно так:

DECLARE @MaxCustomerId INT

SELECT @MaxCustomerId = ISNULL(MAX(CustomerId),0)
FROM Customer

DECLARE @Customer TABLE (
    CustomerId INT,
    Name       VARCHAR(50)
)

INSERT INTO @Customer(CustomerId, Name)
SELECT @MaxCustomerId + ROW_NUMBER() OVER(ORDER BY SomeColumn), Name
FROM YourDataTable

Или вставьте значения во временную таблицу, чтобы вы могли использовать те же идентификаторы для заполнения таблицы заказов.

0 голосов
/ 28 января 2011

Вы можете вставить данные в таблицу с помощью курсора и использовать встроенную функцию SCOPE_IDENTITY(), чтобы получить последний идентификатор, который был вставлен в текущую область (по вашему сценарию).1004 * эта статья MSDN для получения дополнительной информации о SCOPE_IDENTITY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...