Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server自动递增键主键,同时向表中输入新值_Sql_Sql Server - Fatal编程技术网

SQL Server自动递增键主键,同时向表中输入新值

SQL Server自动递增键主键,同时向表中输入新值,sql,sql-server,Sql,Sql Server,我正在工作中编辑一个SQL server存储过程,目前它使用一个游标和@标识执行以下操作。我正试图转向一种更加基于集合的方法 根据我收集到的信息,我正在尝试将临时表(新信息)合并到当前表(旧信息),无需按特定顺序执行以下操作。 -创建新行 -创建新的主密钥 -将旧信息(PrimaryKey除外)复制到新行中。 -将两个旧列更改为“新”信息 我“认为”我面临的问题是如何为所有这些行创建新的primaryKey值。->如何获取数据库中的“最高”旧主键值 所以,;下面是一些看起来有点假的SQL代码 M

我正在工作中编辑一个SQL server存储过程,目前它使用一个游标和@标识执行以下操作。我正试图转向一种更加基于集合的方法

根据我收集到的信息,我正在尝试将临时表(新信息)合并到当前表(旧信息),无需按特定顺序执行以下操作。 -创建新行 -创建新的主密钥 -将旧信息(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是“版本”,因此它应该是主的、唯一的且不为null

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

你知道primaryKey的工作原理吗?我觉得我在概念上遗漏了一些东西。
我正在使用MS-SQL Server。由于工作中的IP策略,我无法提供旧的过程或真实代码。

由于上次创建存储过程并在过程中使用了
@@IDENTITY
函数,我认为它是一个标识列(自动递增),插入新行时不需要为它提供任何值,它为您生成下一个可用值

您在问题中显示的代码根本不是伪SQL代码,它是一个正确的合法的合并语句,用于在一个SQL语句中执行多个操作(删除、更新、插入)

没有关于本示例中使用的表变量的所有信息。因为您已经提到,您希望向数据中添加新行

只需在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

PrimaryKey是否真的是主键,即您无法更改的内容?您可以使用
OUTPUT
子句从行中获取任何数据(注意复数形式),例如
Id
值<代码>输出可与
插入
更新
删除
合并
一起使用,并在
更新
时提供对前后值的访问。一个很值得放在你口袋里的工具。并在获得输出后避免@@IDENTITY;我将如何增加?我觉得我可以做如下的事情。按PrimaryKey说明从源代码顺序中选择前1个PrimaryKey您可能是对的,我不知道PrimaryKey是否。。。是PrimaryKey,如果存在实际约束;但由于我们的版本控制策略,我需要保持旧行的完整性,并将其增加一行。我该如何检查它是否真的是MS SQL中的primaryKey?我不确定您是否正确使用了短语primaryKey。@Zane我对它的理解非常松散。主键不是用于查找其余信息的非空、不同/唯一值吗?我无法在工作中实现这一点,因为项目正在隐藏(需要复杂的业务规则/规范表);但你确实帮我清理了它,我感谢你的帮助。没问题,至少下次当你看到
合并语句时,你会知道这是一个合法的sql代码,不是伪造的sql:)我自己做的sql;我只是把它当作伪代码中的概念练习。我知道这是“真实的”,但很惊讶这是完全合法的。我的工作经常使用游标,很少使用合并语句。
cursors
ouch。。。。尽量避免使用光标。我认为几乎没有任何情况下必须使用游标,否则Temp table、CTE和ranking函数几乎可以在不使用游标的情况下实现所有功能。