Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 TSQL存储复制记录的过程(有一个转折!)_Sql Server_Tsql - Fatal编程技术网

Sql server TSQL存储复制记录的过程(有一个转折!)

Sql server TSQL存储复制记录的过程(有一个转折!),sql-server,tsql,Sql Server,Tsql,我试图在SQLServer(2005)中编写一个存储过程来做一些听起来简单的事情,但事实证明这比我想象的要困难得多 我有一个30列50000行的表 记录的数量是固定的,但用户可以编辑现有记录的字段 为了让他们不必重新输入重复数据,我想让他们能够选择一条记录,并指定一系列ID来复制这些详细信息 我试图写入的SP将包含3个参数:源记录主键,以及数据将复制到的记录范围的上下主键 显然,目标记录的PKs保持不变 因此,我认为SP需要执行一次选择(SELECT)——获取要复制的所有数据,以及一次更新(UP

我试图在SQLServer(2005)中编写一个存储过程来做一些听起来简单的事情,但事实证明这比我想象的要困难得多

我有一个30列50000行的表

记录的数量是固定的,但用户可以编辑现有记录的字段

为了让他们不必重新输入重复数据,我想让他们能够选择一条记录,并指定一系列ID来复制这些详细信息

我试图写入的SP将包含3个参数:源记录主键,以及数据将复制到的记录范围的上下主键

显然,目标记录的PKs保持不变

因此,我认为SP需要执行一次选择(SELECT)——获取要复制的所有数据,以及一次更新(UPDATE)——将数据写入指定的目标记录

我只是不知道如何将SELECT的结果存储到更新中。 临时表没有帮助-从中选择与从表中选择完全相同

我需要的是一个变量,它实际上是一条记录,所以我可以这样做:

@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中如何实现