2010-11-29 14 views
2

SQL Server(2005)にストアドプロシージャを書き込んで、簡単に聞こえるようにしようとしていますが、実際に思ったより難しいことが実証されています。レコードをコピーするためのTSQLストアドプロシージャ

私は30列と50,000行のテーブルを持っています。

レコードの数は固定されていますが、ユーザーは既存のレコードのフィールドを編集できます。

繰り返しデータをキー入力しなくても保存するには、レコードを選択し、その詳細をコピーするIDの範囲を指定する必要があります。

書き込みしようとしているSPには、ソースレコードの主キーと、データがコピーされるレコード範囲の下位および上位の主キーがあります。

宛先レコードの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 

をしかし、私はどのように、またはあなたもできれば分かりません。
私はまた、私が考えていない他の賢い方法にもオープンしています!

ありがとうございました!

答えて

2

私は、SPはSELECTを実行する必要があると考えました - すべてのデータをコピーし、UPDATE - 指定された宛先レコードにデータを書き込むようにしました。あなたが必要なもの

UPDATE ... FROMUPDATEへのT-SQL固有の拡張機能である:UPDATE文でFROM句を置くために、この能力はない標準ANSI 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 

は注意、私は他のRDBMSでこれがどのように行われるのか分かりません。

+0

ブリリアント!どうもありがとう。 – Merlin

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変数を編集する必要があります。

関連する問題