2015-03-16 2 views
0

Для конкретной задачи мне нужно сохранить идентификатор строки в таблице для ее доступа позже. Большинство этих таблиц НЕ имеют числовой идентификатор, а первичный ключ иногда состоит из нескольких полей. VARCHAR & INT комбинированный.Получить значение PRIMARY KEY во время SELECT в ORACLE

Фоновая информация: Таблицы-участники имеют триггер, сохраняющий события удаления, обновления и вставки в общем столбце «синхронизация» (Oracle v11). Каждые 15 минут запускается скрипт для обновления соответствующих таблиц в удаленной базе данных (SQL Server 2012).

Одним из решений, которые я придумал, было использование нескольких столбцов в этой таблице «sync», 3 столбца INT и 3 столбца VARCHAR. Таблица с 2 столбцами VARCHAR затем будет использовать 2 столбца VARCHAR в этой таблице «sync».

Лучшим решением было бы «выбрать» значение первичного ключа и сохранить его в этой таблице.

Пример:

CREATE TABLE [dbo].[Workers](
    [company] [nvarchar](50) NOT NULL, 
    [number] [int] NOT NULL, 
    [name] [nvarchar](50) NOT NULL, 
    CONSTRAINT [PK_Workers] PRIMARY KEY CLUSTERED ([company] ASC, [number] ASC) 
) 

// Fails: 
SELECT [PK_Workers], [name] FROM [dbo].[Workers] 
UPDATE [dbo].[Workers] SET [name]='new name' WHERE [PK_Workers][email protected] 

// Bad (?) but works: 
SELECT ([company] + CAST([number] AS NVARCHAR)) PK, [name] FROM [dbo].[Workers]; 
UPDATE [dbo].[Workers] SET [name]='newname' WHERE ([company] + CAST([number] AS NVARCHAR))[email protected] 

В [PK_Workers] терпит неудачу в этих запросах. Есть ли другой способ получить это значение без ручного комбинирования и литья индекса?

Или есть ли другой способ сделать это, что я не знаю?

+0

В этом вопросе упоминается общая таблица 'sync'. Но ваш код не ссылается на такую ​​таблицу. –

+0

@GordonLinoff, таблица синхронизации в значительной степени помимо точки. Я ищу быстрый и sql-поддерживаемый способ получить указатель на определенную строку. Я поставил пример как можно проще. –

ответ

2

для каждой таблицы создает функцию, возвращающую связанный первичный ключ. создайте также функцию, основанный на этой функции. затем используйте эту функцию в: . SELECT и WHERE. Оговорки

+0

Хорошая точка. Я еще не использовал функциональные индексы. Я посмотрю. –

+0

Это, вероятно, потому, что SQL Server не поддерживает их (Oracle делает). Эквивалент в SQL Server - это индексы на вычисленных столбцах. –