Sql server TSQL存储复制记录的过程(有一个转折!)
我试图在SQLServer(2005)中编写一个存储过程来做一些听起来简单的事情,但事实证明这比我想象的要困难得多 我有一个30列50000行的表 记录的数量是固定的,但用户可以编辑现有记录的字段 为了让他们不必重新输入重复数据,我想让他们能够选择一条记录,并指定一系列ID来复制这些详细信息 我试图写入的SP将包含3个参数:源记录主键,以及数据将复制到的记录范围的上下主键 显然,目标记录的PKs保持不变 因此,我认为SP需要执行一次选择(SELECT)——获取要复制的所有数据,以及一次更新(UPDATE)——将数据写入指定的目标记录 我只是不知道如何将SELECT的结果存储到更新中。 临时表没有帮助-从中选择与从表中选择完全相同 我需要的是一个变量,它实际上是一条记录,所以我可以这样做:Sql server TSQL存储复制记录的过程(有一个转折!),sql-server,tsql,Sql Server,Tsql,我试图在SQLServer(2005)中编写一个存储过程来做一些听起来简单的事情,但事实证明这比我想象的要困难得多 我有一个30列50000行的表 记录的数量是固定的,但用户可以编辑现有记录的字段 为了让他们不必重新输入重复数据,我想让他们能够选择一条记录,并指定一系列ID来复制这些详细信息 我试图写入的SP将包含3个参数:源记录主键,以及数据将复制到的记录范围的上下主键 显然,目标记录的PKs保持不变 因此,我认为SP需要执行一次选择(SELECT)——获取要复制的所有数据,以及一次更新(UP
@tempRECORD = SELECT * FROM SOURCETABLE WHERE ID = @sourcePK
UPDATE SOURCETABLE
SET FIELD1 = @tempRECORD.FIELD1,
FIELD2 = @tempRECORD.FIELD2,
...
FIELD30 = @tempRECORD.FIELD30
WHERE ID >= @LOWER_id AND ID <= @UPPER_id
@tempRECORD=从SOURCETABLE中选择*,其中ID=@sourcePK
更新源表
设置FIELD1=@tempRECORD.FIELD1,
FIELD2=@tempRECORD.FIELD2,
...
FIELD30=@tempRECORD.FIELD30
其中ID>=@LOWER\u ID和ID我很确定这不是最简单的方法,但它应该可以正常工作:
DECLARE @tempField1 varchar(255)
DECLARE @tempField2 varchar(255)
...
DECLARE @tempField30 varchar(255)
SELECT @tempField1 = FIELD1, @tempField2 = FIELD2, ... ,@tempField30 = FIELD30 FROM SOURCETABLE WHERE ID = @sourcePK
UPDATE SOURCETABLE
SET FIELD1 = @tempField1,
FIELD2 = @tempField2,
...
FIELD30 = @tempField30
WHERE ID >= @LOWER_id AND ID <= @UPPER_id
DECLARE@tempField1 varchar(255)
声明@tempField2 varchar(255)
...
声明@tempField30 varchar(255)
选择@tempField1=FIELD1,@tempField2=FIELD2@tempField30=SOURCETABLE中的FIELD30,其中ID=@sourcePK
更新源表
设置字段1=@tempField1,
FIELD2=@tempField2,
...
FIELD30=@tempField30
其中ID>=@下\u ID和ID
因此,我认为SP需要执行一次选择(SELECT)——获取要复制的所有数据,以及一次更新(UPDATE)——将数据写入指定的目标记录
您需要的是对UPDATE
,UPDATE的特定于T-SQL的扩展。。。从
:
UPDATE T
SET
Field1 = source.Field1
, Field2 = source.Field2
, Field3 = source.Field3
FROM
(SELECT * FROM T AS source_T WHERE source_T.ID = @sourcePK) as source
WHERE
T.ID BETWEEN @LOWER_Id AND @UPPER_Id
请注意,在UPDATE
语句中放置FROM
子句的能力不是标准的ANSI SQL,因此我不知道在其他RDBMS中如何实现