2

同じカーソルに異なるselectステートメントを設定する方法を知っている人はいますか?私はこのような何かを考える必要があります。

DECLARE Temp_Cursor CURSOR FOR
IF(@TempVar = 1)
BEGIN
    SELECT CustomerId FROM Customers
END
ELSE IF(@TempVar = 2)
BEGIN
    SELECT OrderId FROM Orders
END
OPEN Temp_Cursor;
FETCH NEXT FROM TempCursor INTO @TempObjectId
WHILE @@FETCH_STATUS = 0
BEGIN 

....など

私は解決策を見つけました:DECLARE @Temp_Cursor CURSOR IF(@TempVar = 1) BEGIN SET @Temp_Cursor = CURSOR FOR SELECT CustomerId FROM Customers END ELSE IF(@TempVar = 2) BEGIN SET @Temp_Cursor = CURSOR FOR SELECT OrderId FROM Orders END OPEN @Temp_Cursor; FETCH NEXT FROM @TempCursor INTO @TempObjectId WHILE @@FETCH_STATUS = 0 BEGIN

4

2 に答える 2

1

完全なクエリは動的でなければなりません。つまり、実行計画は実行時に表示されます。

Declare @SelectStatement Varchar(50)
Declare @SQL Varchar(50)

IF(@TempVar = 1)
BEGIN
    Set @SelectStatement = SELECT CustomerId FROM Customers
END
ELSE IF(@TempVar = 2)
BEGIN
    Set @SelectStatement = SELECT OrderId FROM Orders
END

Set @SQL = 'DECLARE Temp_Cursor CURSOR FOR
OPEN Temp_Cursor;
FETCH NEXT FROM TempCursor INTO ' + @TempObjectId +
'WHILE @@FETCH_STATUS = 0
BEGIN '
于 2012-06-18T09:53:34.680 に答える
1

外側を置き、IF状況ごとに 1 つずつ、2 つの異なるカーソルを実行します。

このような:

IF(@TempVar = 1)
BEGIN

    DECLARE Temp_Cursor CURSOR FOR
    SELECT CustomerId FROM Customers


    OPEN Temp_Cursor;
    FETCH NEXT FROM TempCursor INTO @TempObjectId
    WHILE @@FETCH_STATUS = 0
    BEGIN 
    ....
END
ELSE IF(@TempVar = 2)
BEGIN

    DECLARE Temp_Cursor CURSOR FOR
    SELECT OrderId FROM Orders


    OPEN Temp_Cursor;
    FETCH NEXT FROM TempCursor INTO @TempObjectId
    WHILE @@FETCH_STATUS = 0
    BEGIN 
    ....
END

もう 1 つの可能性は、動的 SQLを使用することです。

于 2012-06-18T09:54:08.737 に答える