【发布时间】:2014-01-25 16:17:00
【问题描述】:
我正在编辑一个 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 服务器。由于工作中的 IP 政策,我无法提供旧的 proc 或真实代码。
【问题讨论】:
-
PrimaryKey 真的是主键吗,即您无法更改的东西?您可以使用
OUTPUT子句从行中获取任何数据(注意复数。),例如Id值。OUTPUT可以与INSERT、UPDATE、DELETE和MERGE一起使用,并在UPDATE的情况下提供对前后值的访问。一个非常值得放在口袋里的工具。并避免@@IDENTITY。 -
得到输出后;我将如何增加?我觉得我可以做类似以下的事情。 SELECT TOP 1 PrimaryKey FROM Source ORDER BY PrimaryKey DESC
-
您可能是对的,我不知道 PrimaryKey... 是否是 PrimaryKey 以及是否存在实际约束;但由于我们的版本控制策略,我需要保持旧行不变并将其加一。如何检查它是否真的是 MS SQL 中的主键?
-
我不确定您是否正确使用了短语 Primary Key。
-
@Zane 我对它很松懈。主键不是用于查找其余信息的非空、不同/唯一值吗?
标签: sql sql-server