处理“重复”的最佳方式

时间:2014-10-05 18:58:12

标签: sql-server tsql uniqueidentifier

我有一个存储过程,可以将数据从ERP提取到数据仓库(DW)中。 我面临的问题是DW的人要求我为每行提供一个唯一的ID。

示例

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在[DISTRIBUTION]处有两条记录,您将从上面的查询中获得两条记录,并且表[DISTRIBUTION]不包含每条记录的ID线。

问题

所以,我需要动态创建一个ID:

  • 唯一(每行必须不同)
  • 可重复(每次运行进程时,相同的记录必须具有相同的ID值)
  • 我无法在ERP级别拥有ID 。我不能只为[DISTRIBUTION]添加和ID 因为它是第三方,设计不良的ERP。

我已尝试过的内容

  • 二进制校验和不安全,如果数据更改,ID会发生变化。
  • ROW_NUMBER()就是我正在使用的但是......我对此并不感到舒服。影响表现 并且,它有可能发生变化。
  • 退出我的工作不是一种选择:)

1 个答案:

答案 0 :(得分:0)

在Oracle中,每个表中的每一行都有ROWID,在SQL Server上有一个未记录的列 %% physloc %% 与ROWID相同。

所以在你的情况下你可以试试。

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

有关 %% physloc %%

的更多信息,请参阅stackoverflow上写得非常好的answer