Вывести несколько столбцов идентификаторов из временной таблицы - PullRequest
1 голос
/ 21 октября 2011

Я использую SQL Server 2K8, и у меня есть таблица, используемая исключительно для генерации идентификаторов, так что первичный ключ уникален для нескольких таблиц - уникальность для нескольких таблиц для дерева иерархии элементов, которое требует, чтобы у каждого узла был уникальный идентификатор независимо от типа.

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

CREATE TABLE [dbo].[MyTreeElementIDGenTab](
        [MyTreeElementID] [int] IDENTITY(1,1) NOT NULL
)   

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

Я думал, что мог бы использовать ROW_NUMBER () для генерации индекса и поместить соответствующий индекс в исходную таблицу, но не добился никакого прогресса. Любая помощь приветствуется!

DECLARE @NodeTypeATab TABLE
(
    NodeTypeATabId INT NULL,        -- To be populated by dbo.MyTreeElementIDGenTab
    Name NVARCHAR(MAX),
    ItemIndex INT NOT NULL      -- I can initially populate this from the client starting 
                            -- with Index # 1 for joining but maybe I don't need it?
)

-- Populate @NodeTypeATab with test data here

DECLARE @EntityIdTab TABLE
(   
    ElementId INT NOT NULL,
    ItemIndex INT NOT NULL
)

-- This below doesn't compile to generate a new ElementId to later be set in NodeTypeATabId above
-- I want to output the generated ID into the temp table but also have a "correlation/index ID" to set
-- back in the original table or some way if not via a correlation/index ID 

INSERT INTO dbo.MyTreeElementIDGenTab DEFAULT VALUES
OUTPUT INSERTED.MyTreeElementID, ROW_NUMBER() OVER(ORDER BY MyTreeElementID ASC) INTO @EntityIdTab
FROM @NodeTypeATab

Ответы [ 2 ]

1 голос
/ 21 октября 2011

Звучит так, будто вы пытаетесь эмулировать конструкцию «Последовательность», которая будет доступна в SQL Server Denali. Существует множество решений для последовательностей для SQL Server, размещенных вокруг, но вам нужно знать термин для поиска чтобы получить результаты.

Например, ниже приводится статья SQL CAT, касающаяся миграции последовательностей Oracle (которые предоставляют то, что вы пытаетесь сделать) в SQL Server.

http://blogs.msdn.com/b/sqlcat/archive/2006/04/10/sql-server-sequence-number.aspx

Альтернативой для рассмотрения является использование идентификаторов GUID для получения уникального идентификатора, который является довольно стандартным способом получения уникальных идентификаторов для строк во всей системе.

1 голос
/ 21 октября 2011

Не уверен, что я понимаю, куда вы хотите поместить сгенерированные идентификаторы, но вы можете использовать слияние и таблицу чисел для создания нескольких идентификаторов одновременно.Вот пример кода, который использует master..spt_values ​​для генерации 10 идентификаторов.

merge into MyTreeElementIDGenTab as T
using (select Number
       from master..spt_values
       where Number between 1 and 10 and
             [Type] = 'P') as S(I) 
on 0=1
when not matched then
  insert default values
output inserted.MyTreeElementID;  
...