创建存储过程以使用上一行中的数据更新SQL数据库中的行

时间:2013-04-05 12:37:26

标签: sql sql-server tsql stored-procedures

下午好,

我有一个数据库,用于跟踪装配线上的生产。

有效地,成品将显示生产线的每个stage以及当前生产线的序列号。

我创建了一个存储过程来检索和显示这些数据,但我正在努力将机器从stage 1移到stage 2stage 2stage 3 etc ...表非常简单,它包含以下行:

Stage_ID (PK, int, not null)
Build_ID(FK, int, null)

实际上,我想构建一个存储过程来将Build_ID的值Stage_ID = 1移动到Stage_ID = 2

知道怎么做吗?

由于

4 个答案:

答案 0 :(得分:1)

update stageTable
set build_id = (select build_id from stageTable where stage_id = 1)
where stage_id = 2

如果你需要它作为一个程序,你可以做这样的事情

create procedure sp_moveStage(@from int, @to int)
as 

update stageTable
set build_id = (select build_id from stageTable where stage_id = @from)
where stage_id = @to

并使用

执行它
exec sp_moveStage 1, 2

答案 1 :(得分:0)

键不可变,因此您必须插入新行并删除旧行。不是你理想的设计。

P.S。如果StageID是您拥有的PK,则只能有一行StageID = 2:

 Stage_ID (PK, int, not null)   <<<---
 Build_ID(FK, int, null)

你想要的是这样一个表:

  create table process
  (id int primary key,
   buildid int not null,
   stage  int not null,
   entrydatetime datetime,
   exitdatetime datetime
   )

显示构建何时进入并离开处理阶段。或者,如果阶段值可以以有意义的方式顺序排序,则可以通过假设下一阶段的输入时间来导出阶段退出的时间。

无论如何,你不想让像“过程中的阶段”这样的变化值成为PK。 Stage是更改值,构建的属性或属性,而PK是不可变实体标识符。

答案 2 :(得分:0)

这样的事可能有用。
第1步 - 获取构建ID的最大阶段ID并将其设置为变量。 第2步 - 向表中添加记录。 stage id将是步骤1中的变量加上1。

答案 3 :(得分:0)

ERM,

DECLARE @Build_ID int;

BEGIN TRANSACTION;

SELECT @Build_ID = Build_ID FROM SomeTable WHERE Stage_ID = 1;

UPDATE SomeTable SET Build_ID = @Build_ID WHERE Stage_ID = 2;

COMMIT TRANSACTION;