通常、すでに挿入されている行を更新するのではなくComputerReport
、正しい決定済みの行を挿入する必要があります。SFID
INSERT INTO ComputerReport
(SFID, CrComputerName, CrLastUpdatedBy) -- add other columns as neeeded
SELECT SFID, 'JAMI-HP', 'JAMIE-HP\JAMIE'
FROM SoftwareReport
ComputerReport
テーブルにまだ価値のあるものが含まれていない場合は、テーブルを切り捨てて上記の挿入を行うことができます。
それ以外の場合は、各テーブルを追跡するカーソルが必要であり、カーソル位置の最初のテーブルSFID
の値に従って、カーソル位置の 2 番目のテーブルに設定します。SFID
理想的な状況では、行を作成したばかりで、どちらのテーブルにもギャップがなく、両方に同じ数の行が含まれているため、単純に次のように記述できます。
UPDATE ComputerReport
SET SFID = CRID
しかし、一般的なケースでは、より複雑なスクリプトに頼る必要があります。
DECLARE @sfid, @crid
DECLARE sfcursor READONLY
FOR SELECT SFID
FROM SoftwareReport
WHERE SFName IS NOT NULL
ORDER BY SFID ASC;
DECLARE crcursor
FOR SELECT CRID
FROM ComputerReport
-- WHERE SFID IS NULL
ORDER BY CRID ASC
FOR UPDATE SFID;
OPEN sfcursor;
OPEN crcursor;
FETCH NEXT FROM sfcursor INTO @sfid;
FETCH NEXT FROM crcursor INTO @crid;
-- update for each rows until we reach the end of either cursor
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE crcursor SET SFID = @sfid;
FETCH NEXT FROM sfcursor INTO @sfid
FETCH NEXT FROM crcursor INTO @crid
END
-- if there are remaining rows in sfcursor, insert new rows in ComputerReport
FETCH RELATIVE 0 FROM sfcursor INTO @sfid
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO ComputerReport (SFID) -- you should add the other columns here as needed
VALUES (@sfid);
FETCH NEXT FROM sfcursor INTO @sfid
END
CLOSE crcursor
CLOSE sfcursor
DEALLOCATE sfcursor
DEALLOCATE crcursor
スクリプトで示されているように、必要な列と値をINSERT
使用して余分な行のクエリを修正する必要があります。ComputerReport
カーソル ベースのスクリプトは、通常の (セット ベースの) クエリに比べて遅いことに注意してください。参考文献: