SQL Server自动增加键主键,同时将新值赋予表

时间:2014-01-07 20:07:02

标签: sql sql-server

我正在编辑工作中的SQL服务器存储过程,目前它使用游标和@@ Identity来执行以下操作。我正试图采用更基于集合的方法。

从我收集的内容中,我试图将临时表(新信息)合并到当前表(旧信息)。没有特别的顺序,我需要做类似以下的事情。   - 创建新行   - 创建新的PrimaryKeys   - 将旧信息(除了PrimaryKey)复制到新行中。   - 将两个旧列更改为“新”信息。

我“想”我遇到的问题是如何为所有这些行创建新的primaryKey值。 - >如何获取数据库中“最高”的旧主键值?

因此;这里有点假看的SQL代码。

Merge Target as T
Using @TemporaryTable as S --Source
on T.vPrimaryID = S.vPrimaryID
AND T.Arbitary = S.Arbitrary --Arbitrary business rule, shouldn't matter
WHEN MATCHED THEN
UPDATE SET
PrimaryKey = newPrimaryKey -- This is where I'm having problems 
Col2 = S.col2
Col3 = T.col3
Col4 = T.col4
Col5 = GetDate() --new Timestamp

数据库设置为“版本化”,primaryKey是“版本”,因此它应该是主要的,唯一的而不是空的。

为了在运行之后完全公开,我需要TARGET表来更新其先前匹配的行并将布尔标志从true设置为false。 (基本上是软删除) 那部分我现在不太担心。

有关primaryKey如何工作的任何想法?我觉得我在概念上遗漏了一些东西。 我正在使用MS-SQL Server。由于我的工作中的IP政策,我无法提供旧的proc或真实代码。

1 个答案:

答案 0 :(得分:0)

由于上一个创建了一个存储过程并在过程中使用了@@IDENTITY函数的人,我把它作为一个IDENTITY列(自动增量),在插入新行时你不需要为它提供任何值,它为您生成下一个可用值。

您在问题中显示的代码根本不是fake SQL Code,它是一个合适的合法MERGE STATEMENT,当您想要在一个SQL语句中执行多个操作时使用(DELETE,UPDATE, INSERT)。

没有本节目示例中使用的有关表变量的所有信息。由于您已经提到过要为数据添加新行。

您可以在merge语句中添加另一个条件,以添加目标表中不存在的行。它已经在更新已存在的行。

你可以这样做......

Merge Target as T
Using(SELECT * FROM @TemporaryTable) as S   --Source
on T.vPrimaryID = S.vPrimaryID
AND T.Arbitary = S.Arbitrary --Arbitrary business rule, shouldn't matter
WHEN MATCHED THEN
UPDATE SET
                      -- For Primary key its an Identity column it will 
T.Col2 = S.col2         -- generate the new values for you 
T.Col3 = S.col3
T.Col4 = S.col4
T.Col5 = GetDate() 

WHEN NOT MATCHED THEN 
 INSERT (T.Col2,T.Col3,T.Col4,T.Col5,....)  -- Do not use the Identity column here 
  VALUES (S.Col2,S.Col3,S.Col4,S.Col5,....)  -- it will be auto generated for you