2013-04-15 100 views
0

也許有更好的辦法可以解決這個問題,但這必須有些動態。SQL Server 2008:用於檢索和替換數據的光標

從vb.net窗體我需要恢復或從一個表中的數據替換到另一個。除了幾個不同的列以外,這兩個表是相同的。

首先我寫了一些SQL來獲取傳入的表的列名。然後通過序數位置,我只獲取我想要的值的表。我將這些表名存儲在臨時表中。

現在我想使用臨時表列名從備份表中獲取這些值,並將它們放在主表中。

所以我想我想我需要一個遊標以某種方式循環..自大學和哇,我沒有觸及遊標。

我會讓自己難堪併發布我當前的代碼。

SET @getColCURSOR = CURSOR FOR 
    SELECT name 
    FROM #MyTempTable --created previously as table only holding column names 

OPEN @getColCURSOR 
FETCH NEXT FROM @getColCURSOR 
INTO @columnName 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    select @columnName --this variable should as a column name and change 
    from AUDIT_TABLE a where a.ID = 7 -- 7 is just for testing is dynamic variable 
    FETCH NEXT FROM @getColCURSOR 
INTO @columnName 
END 

CLOSE @getColCURSOR 
DEALLOCATE @getColCURSOR 
+0

很難說出你在問什麼。請使用表格定義和示例數據來展開「我需要將數據從一個表格恢復或替換爲另一個表格」。 –

+0

向我們展示您的審計表結構和您的主表結構。 CAn您的審計表包含相同ID的多個記錄? – HLGEM

+0

審計表基本上是每個表的備份(即觸發器跟蹤更改)。每個審計表都有一個自發的PK,裏面是它備份的表的主鍵。我爲表格提供了一個下拉列表,並在datagridview中顯示列。在選擇你捕獲各種數據發送到查詢/存儲特效,以恢復用戶可能做了些什麼......愚蠢的變化。 – DJPlayer

回答

2

我不打算上,這是否可以不帶光標進行評論,因爲我對你想要做什麼有點失落。但是,光標的一個問題是,您無法在select語句中對列名稱進行參數化。所以,你需要替換此:

WHILE @@FETCH_STATUS = 0 
BEGIN 
    select @columnName --this variable should as a column name and change 
    from AUDIT_TABLE a where a.ID = 7 -- 7 is just for testing is dynamic variable 
    FETCH NEXT FROM getColCURSOR 
INTO @columnName 
END 

--with動態SQL這樣的:

DECLARE @SQL nvarchar(max) 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    set @SQL = 
     N'select ' + QUOTENAME(@columnName) + ' from AUDIT_TABLE a where a.ID = 7' 
    EXEC (@SQL); --w/o brackets assumes you've calling a stored proc 
    FETCH NEXT FROM getColCURSOR 
INTO @columnName 
END 

那些可能引入其他的問題,因爲動態SQL語句在自己的範圍內執行。我一定會鼓勵你看看是否有一個基於集合的解決方案,因爲使用動態SQL會使這變得更加混亂,而且我不認爲如果你想使用動態SQL列名變量。

+0

你能看到我爲什麼會收到很多記錄的原因嗎?我得到正確的列和信息..但它重複了很多次..我將不得不計數(*)來找出多少......但不少。 – DJPlayer

+0

是每個單獨的'select'返回的記錄太多,還是選擇重複多次? –

+0

選擇正在重複多次,現在正在運行幾個測試。 – DJPlayer