Как мне перенести эти данные в эти таблицы Sql Server?

Я хочу перенести некоторые данные из одной таблицы в эти новые ТРИ таблицы.

Вот моя схема назначения:

альтернативный текст

Обратите внимание, что мне нужно вставить в первую таблицу Location.. взять SCOPE_IDENTITY().. затем вставить строки в таблицы Boundary и Country.

SCOPE_IDENTITY() меня убивает :( то есть я вижу способ сделать это только через CURSORS. Есть ли лучшая альтернатива?

ОБНОВИТЬ

Вот скрипты для схемы БД....

Местоположение

CREATE TABLE [dbo].[Locations](
    [LocationId] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](100) NOT NULL,
    [OriginalLocationId] [int] NOT NULL,
 CONSTRAINT [PK_Locations] PRIMARY KEY CLUSTERED 
(
    [LocationId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) 

Страна

CREATE TABLE [dbo].[Locations_Country](
    [IsoCode] [nchar](2) NOT NULL,
    [LocationId] [int] NOT NULL,
 CONSTRAINT [PK_Locations_Country] PRIMARY KEY CLUSTERED 
(
    [LocationId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Locations_Country]  WITH CHECK ADD  CONSTRAINT [FK_Country_inherits_Location] FOREIGN KEY([LocationId])
REFERENCES [dbo].[Locations] ([LocationId])
GO

ALTER TABLE [dbo].[Locations_Country] CHECK CONSTRAINT [FK_Country_inherits_Location]
GO

Граница

CREATE TABLE [dbo].[Boundaries](
    [LocationId] [int] NOT NULL,
    [CentrePoint] [varbinary](max) NOT NULL,
    [OriginalBoundary] [varbinary](max) NULL,
    [LargeReducedBoundary] [varbinary](max) NULL,
    [MediumReducedBoundary] [varbinary](max) NULL,
    [SmallReducedBoundary] [varbinary](max) NULL,
 CONSTRAINT [PK_Boundaries] PRIMARY KEY CLUSTERED 
(
    [LocationId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[Boundaries]  WITH CHECK ADD  CONSTRAINT [FK_LocationBoundary] FOREIGN KEY([LocationId])
REFERENCES [dbo].[Locations] ([LocationId])
GO

ALTER TABLE [dbo].[Boundaries] CHECK CONSTRAINT [FK_LocationBoundary]
GO

person Pure.Krome    schedule 18.10.2010    source источник


Ответы (2)


Я не вижу необходимости в SCOPE_IDENTITY или курсорах, если вы подходите к данным в порядке отношения родитель/потомок:

INSERT INTO LOCATION
  SELECT t.name,
         t.originallocationid
    FROM ORIGINAL_TABLE t
GROUP BY t.name, t.originallocationid

INSERT INTO COUNTRY 
SELECT DISTINCT
       t.isocode,
       l.locationid
  FROM ORIGINAL_TABLE t
  JOIN LOCATION l ON l.name = t.name
                 AND l.originallocationid = t.originalocationid

INSERT INTO BOUNDARY
SELECT DISTINCT
       l.locationid,
       t.centrepoint,
       t.originalboundary,
       t.largereducedboundary,
       t.mediumreducedboundary,
       t.smallreducedboundary
  FROM ORIGINAL_TABLE t
  JOIN LOCATION l ON l.name = t.name
                 AND l.originallocationid = t.originalocationid
person OMG Ponies    schedule 18.10.2010
comment
@OMG Ponies - я не уверен, как я могу вставить в таблицу COUNTRY, учитывая, что PK не является идентификатором (обратите внимание на наследование ... хотя это диаграмма классов, а не реальная схема БД), а PK + FK . - person Pure.Krome; 18.10.2010
comment
@Pure.Krome: Что вы используете в качестве первичного ключа в таблице COUNTRY? Существует ли первичный ключ в исходной таблице? - person OMG Ponies; 18.10.2010
comment
@OMG Ponies - я обновлю схему до OP. BRB извините за это... - person Pure.Krome; 18.10.2010
comment
Дин! Победить! Не знаю, почему я никогда не думал о ссылке на имя И оригинальный идентификатор ... мило. Ура @OMG Ponies (снова) :) - person Pure.Krome; 18.10.2010

После загрузки таблицы Location вы можете создать запрос, который объединяет Location с вашей исходной одиночной таблицей. Критерием соединения будет естественный ключ (это столбец Name?), и он вернет новый LocationId вместе с данными Boundary. Результаты будут вставлены в новую таблицу границ.

person bobs    schedule 18.10.2010
comment
Имя существует только в родительской таблице: Location. Единственным соединением между ними будет LocationId PK/PK+FK. - person Pure.Krome; 18.10.2010