2

2つのテーブルがあります。1つはProductと呼ばれ、もう1つはProductVariantと呼ばれます。ProductVariantにはProductのIDがあります。両方のテーブルで簡単な操作を行う必要があります。

これが私が思いついたクエリです:

declare @id int

declare cur CURSOR LOCAL for
select @id = ProductID  from Product WHERE (Published = '0')

open cur

fetch next from cur into @id 

while @@FETCH_STATUS = 0 BEGIN

UPDATE Productvariant SET Cost = SalePrice WHERE VariantID = @id;
UPDATE ProductVariant SET SalePrice = 0.00 WHERE VariantID = @id; 

fetch next from cur into @id 
END

close cur
deallocate cur

しかし、それは私に与えます:Msg 154、レベル15、状態3、行4の変数割り当てはカーソル宣言では許可されていません。

ありがとう

4

5 に答える 5

3

あなたは次のようなことを試すことができます:

UPDATE ProductVariant SET Cost =SalePrice , SalePrice = 0.00
WHERE VariantID IN (SELECT productID FROM Product WHERE Published = '0')
于 2012-11-23T12:00:23.617 に答える
1

最初の4行は次のようになります。

declare @id int

declare cur CURSOR LOCAL for
select ProductID  from Product WHERE (Published = '0')
于 2012-11-23T11:57:38.160 に答える
1

代わりにこのようなことをします。

SQLフィドル

MS SQL Server 2008スキーマのセットアップ

create table Product
(
  ProductID int,
  Published char(1)
);

create table ProductVariant
(
  VariantID int,
  Cost money,
  SalePrice money
);

insert into Product values
(1, '0'),
(2, '1'),
(3, '0')

insert into ProductVariant values
(1, 0, 10),
(1, 0, 11),
(2, 0, 20),
(2, 0, 21),
(3, 0, 30),
(3, 0, 31);

クエリ1

UPDATE ProductVariant 
SET    Cost = SalePrice, 
       SalePrice = 0.00 
FROM   Product 
WHERE  Product.ProductID = ProductVariant.VariantID AND
       Product.Published = '0';

SELECT *
FROM ProductVariant;

結果

| VARIANTID | COST | SALEPRICE |
--------------------------------
|         1 |   10 |         0 |
|         1 |   11 |         0 |
|         2 |    0 |        20 |
|         2 |    0 |        21 |
|         3 |   30 |         0 |
|         3 |   31 |         0 |
于 2012-11-23T11:58:44.727 に答える
1

カーソルの使用方法を学習している場合は、selectから@idを削除するだけです。すでにfetchnext....行でその値をフェッチしています。

declare cur CURSOR LOCAL for
select ProductID  from Product WHERE (Published = '0')

ただし、カーソルよりも優れた別の方法を使用する必要があります

declare @id int
declare @idTable as table(id int)

insert into @idTable
select ProductID  from Product WHERE (Published = '0')

while(exists(select top(1) id from @idTable)) 
begin
    select top(1) @id = id from @idTable

    UPDATE Productvariant SET Cost = SalePrice WHERE VariantID = @id;
    UPDATE ProductVariant SET SalePrice = 0.00 WHERE VariantID = @id; 

    delete top(1) from @idTable
end
于 2012-11-23T12:00:11.930 に答える
0
declare cur CURSOR LOCAL for
select ProductID  from Product WHERE (Published = '0')

select @id = ProductIDそれがフェッチがあなたのために行うことなので、あなたは必要ありません。の値を取得してProductID 入れます@id

お役に立てば幸い

于 2012-11-23T12:03:11.547 に答える