2014-10-05 3 views
2

У меня есть хранимая процедура, которая извлекает данные из ERP в хранилище данных (DW). Проблема, с которой я сталкиваюсь, заключается в том, что люди из DW попросили меня иметь уникальный идентификатор для каждой строки, которой у меня нет.Лучший способ борьбы с «дубликатами»

Пример

CREATE TABLE [dbo].[INVOICES](
    [InvID] [nchar](10) NULL, 
    [LineID] [nchar](10) NULL, 
    [Amount] [decimal](32, 4) NULL 
) ON [PRIMARY] 

CREATE TABLE [dbo].[DISTRIBUTION](
    [InvID] [nchar](10) NULL, 
    [LineID] [nchar](10) NULL, 
    [Percent] [decimal](3, 2) NULL 
) ON [PRIMARY] 

InvID  LineID  Amount 
---------- ---------- --------------------------------------- 
FC0000001 1   6788.0000 
FC0000001 2   8908.0000 

InvID  LineID  Percent 
---------- ---------- ---------------------- 
FC0000001 1   10 
FC0000001 1   90 
FC0000001 2   100 

Таким образом, вы можете запросить:

SELECT I.InvID + '-' + D.LineID AS ID, D.* 
FROM [INVOICES] AS I 
LEFT JOIN [DISTRIBUTION] AS D 
    ON D.InvID = I.InvID 
    and D.LineID = I.LineID 

И получите:

ID     InvID  LineID  Percent 
-------------------- ---------- ---------- ---------------------- 
FC0000001-1   FC0000001 1   10 
FC0000001-1   FC0000001 1   90 
FC0000001-2   FC0000001 2   100 

Но, как вы видите, если есть две записи в [РАСПРОСТРАНЕНИЕ] для того же LineID и InvID, вы получите две записи из запроса ab ove, а таблица [DISTRIBUTION] не содержит идентификатора для каждой строки.

Проблема

Итак, мне нужно создать идентификатор на лету, который:

  • Unique (каждая строка должна быть разными)
  • Repeteable (каждый раз, когда я бегу процесс, те же записи должны иметь одинаковое значение ID)
  • У меня не может быть ID на уровне ERP. Я не могу просто добавить и ID в таблицу [DISTRIBUTION] , потому что это сторонний, плохо спроектированный ERP.

То, что я уже пытался

  • Бинарные контрольные суммы не являются безопасными и, если данные изменения изменения идентификатора.
  • ROW_NUMBER() - это то, что я использую, но ... Я не уверен в этом. Влияет на производительность , и есть шанс, что он изменится.
  • помнится мою работу это не вариант :)
+1

Я редактировал свой титул. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Какой ERP это - могут быть люди, которые решили проблему, которая у вас уже есть? Вы связались с их поддержкой? –

+0

Возможно ли, что распределение будет когда-либо изменено или для позиций, которые когда-либо будут изменяться? Если это так, я думаю, что «повторяемость» невозможна, если вы не сохраните отображение между распределениями и позициями. –

ответ

0

В Oracle есть ROWID для каждой строки в каждой таблице, на SQL Server есть недокументированная колонка %% physloc %% как же из ROWID ,

Так что в вашем случае вы можете попробовать.

SELECT %%physloc%%, * 
FROM [DISTRIBUTION] 

Смотрите очень хорошо написано answer на StackOverflow для получения дополнительной информации о %% physloc %%