我正在尝试在SQL Server(2005)中编写一个存储过程来做一些听起来很简单的事情,但实际上我认为这更难实现。
我有一个包含30列和50,000行的表。
记录数量是固定的,但用户可以编辑现有记录的字段。
为了保存他们不得不重新键入重复数据,我想让他们能够选择一条记录,并指定一系列ID来复制这些细节。
我正在尝试编写的SP将采用3个参数:源记录主键,以及将数据复制到的记录范围的低位和高位主键。
显然,目的地记录的PK保持不变。
所以我认为SP需要执行SELECT - 获取要复制的所有数据,并且需要UPDATE - 将数据写入指定的目标记录。
我只是不知道如何存储SELECT的结果以将它们插入UPDATE。 临时表无济于事 - 从中选择就像从表中选择一样!
我需要的是一个实际上是单个记录的变量,所以我可以这样:
@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
但我不知道如何,或者你是否可以 我也对任何其他我从未想过的聪明方式持开放态度!
谢谢你们!
答案 0 :(得分:2)
所以我认为SP需要执行SELECT - 获取要复制的所有数据,并且需要UPDATE - 将数据写入指定的目标记录。
您需要的是UPDATE
,UPDATE ... FROM
的特定于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
请注意,在FROM
语句中放置UPDATE
子句的能力是而不是标准ANSI SQL,因此我不知道如何在其他情况下完成此操作的RDBMS。
答案 1 :(得分:1)
我很确定这不是最简单的方法,但它应该没有任何问题:
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
您需要编辑tempField变量,以便它们具有正确的类型。