2010-04-04 55 views
0

的結果,我有一個存儲過程SQL服務器遊標數據存儲過程

DECLARE cursor FOR SELECT [FooData] From [FooTable]; 
OPEN cursor ; 
FETCH NEXT FROM cursor INTO @CurrFooData; 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SELECT @CurrFooData AS FooData; 
    INSERT INTO Bar (BarData) VALUES(@CurrFooData); 
    FETCH NEXT FROM cursor INTO @CurrFooData; 
END; 
CLOSE cursor 
DEALLOCATE cursor 

但結果我有很多的表,而不是之一。我怎樣才能返回一個表'FooData'列和所有'@CurrFooData'行?

+0

這個例子可以,但是如果select語句和insert中的列表應該不同呢? – 2010-04-04 14:21:50

+0

喜歡它: DECLARE cursor FOR SELECT [FooData1],[FooData2] From [FooTable]; OPEN光標; FETCH NEXT FROM cursor INTO @ CurrFooData1,@ CurrFooData2; WHILE @@ FETCH_STATUS = 0 BEGIN SELECT @ CurrFooData1 AS FooData1,@ CurrFooData2 AS FooData2; INSERT INTO Bar(BarData)VALUES(@ CurrFooData1); FETCH NEXT FROM cursor INTO @CurrFooData; END; 關閉遊標 DEALLOCATE遊標 – 2010-04-04 14:23:00

+0

問題和答案沒有意義:你爲什麼要這樣做? – gbn 2010-04-04 14:24:12

回答

1

德米特里,我認爲你應該真的試圖擺脫那個光標一起。在第二個例子中,你選擇兩個領域FooData1FooData2,但最終,你永遠只能插入價值....

您可以輕鬆地重寫第二查詢 - 是這樣的:

INSERT INTO Bar (BarData) 
    SELECT FooData1 FROM FooTable 

這就是你的整個光標,一切都在做。

不惜一切代價儘量避免遊標 - 99%的時間,他們不需要 - 開始思考數據的SETS - 不要堅持程序循環和遊標在SQL - 這不是一個好匹配!

如果需要輸出你剛剛插入的是什麼,使用OUTPUT條款:

INSERT INTO Bar (BarData) 
    OUTPUT Inserted.* 
    SELECT FooData1 FROM FooTable 
+0

我需要從存儲過程返回數據(「SELECT @ CurrFooData1 AS FooData1,@ CurrFooData2 AS FooData2」)。 但「INSERT INTO .. SELECT ..」不返回任何數據。 – 2010-04-04 16:29:21

+0

@Dmitry:更新了我的答案 - 使用'OUTPUT'子句重新輸出剛剛插入的內容 – 2010-04-04 18:15:06

1

是不是要輸出你剛插入的數據?如果是這樣的話,如果你使用的是SQL Server版本以前到SQL Server 2005,那麼你可以的東西,你想要的值到一個臨時表所示:

Create Table #FooTemp (FooData ...) 

Insert #FooTemp(FooData) 
Select FooData 
From FooTable 

Insert Bar(BarData) 
Select FooData 
From #FooTemp 

Select FooData 
From #FooTemp 

這樣做的缺點方法是,它可能會導致您的存儲過程在每次運行時因爲臨時表而重新編譯。

如果您正在使用SQL Server 2000 +,你可以做上面一樣只在表變量:

Declare @FooTemp Table (FooData ...) 

Insert @FooTemp(FooData) 
Select FooData 
From FooTable 

Insert Bar(BarData) 
Select FooData 
From @FooTemp 

Select FooData 
From @FooTemp 

如果您正在使用SQL Server 2005 +,你可以使用OUTPUT子句,如下所示:

Insert Bar(BarData) 
OUTPUT inserted.BarData 
Select FooData 
From FooTable