2015-12-01 37 views
-1

全部,將光標設置在表格變量中的表格上

試圖在表格變量內的表值上設置遊標,但它不起作用。任何人都可以評論我如何解決這個問題?

**下面的代碼是從它的表名變量提供值的另一個存儲過程調用**

ALTER PROCEDURE [dbo].[usrSetLTDNormDist] 
    -- Add the parameters for the stored procedure here 
    @TableName Sysname, 

---... 

    DECLARE @SQLCommand1 NVARCHAR(MAX) = N' 
    Set @RecCursor1 = Cursor For 
     Select [Volume], [TRANSDATE] from @TableName' 

    EXECUTE dbo.sp_executesql @sqlCommand1 

    -- Open Cursor 
    Open @RecCursor1 
    Fetch Next From @RecCursor1 
    Into @Volume, @TransDate 

---... 
+1

對不起 - 不太清楚 - 是@ @ TableName a * string *還是[table variable](https://msdn.microsoft.com/zh-CN/library/ms175010.aspx)?無論哪種方式,正如目前所寫,這是打破 - 'EXEC'在新的範圍內運行代碼,範圍不能訪問外部範圍的變量。 –

+0

達米安,請參閱上文,我將這些變量添加到代碼中。有什麼建議麼? – HDB

回答

0

DECLAREEXECUTE語句之間添加PRINT @SQLCommand1審查實際上正在執行什麼。根據您的代碼段,你會看到

Set @RecCursor1 = Cursor For 
Select [Volume], [TRANSDATE] from @TableName 

...也就是說,你在@tablename設置的值不會自動的加入到腳本。下面是我寫這些東西的途徑:我用的是<>字符以使替換值中脫穎而出

DECLARE @SQLCommand1 NVARCHAR(MAX) 

SET @SQLCommand1 = replace(N' 
Set @RecCursor1 = Cursor For 
Select [Volume], [TRANSDATE] from <@TableName>' 
,'<@TableName>', @TableName) 

PRINT @SQLCommand1 

EXECUTE dbo.sp_executesql @sqlCommand1 

+0

謝謝菲利普,但這仍然不能解決光標問題。查詢看起來不錯,但由於某種原因,它沒有給RecCursor1賦值 – HDB

+0

我非常有意識地使用遊標很少有經驗。我會想象遊標是在爲生成運行動態SQL而生成的會話中創建的,在該動態SQL會話期間持續存在,並在會話關閉時關閉 - 即幾乎立即關閉。 –

+0

只是一個想法:遊標可以運行在視圖上嗎?使用動態SQL創建一個視圖(該視圖將持續超出「創建視圖」會話),對視圖運行光標,然後在完成後刪除視圖。這引發了很多問題(如同時運行該流程的「同時視圖」,如果不放棄視圖會發生什麼情況等等),如果您嘗試類似的方式使用偏執級別的警告。 –

0

此腳本演示了一般的技術:

create table T (ID int not null) 
go 
insert into T(ID) values (99) 
go 
declare @TableName sysname 
declare @ID int 

set @TableName = 'T' 

declare @SQL nvarchar(max) = N'declare boris cursor for select ID from ' + 
           QUOTENAME(@TableName) 

exec sp_executesql @SQL 

open boris 

fetch next from boris into @ID 
while @@FETCH_STATUS = 0 
begin 
    print @ID 

    fetch next from boris into @ID 
end 
close boris 
deallocate boris 

生產這種輸出:

(1 row(s) affected) 
99 

不過,我會提供我平時注意 - 如果你的情況是,你要操作反對多個表以相同的方式,這通常是一個破碎的數據模型的標誌。通常應該有一個單個表表,其中包含用於區分這些值的數據的附加列。

+0

在@SQL字符串中聲明遊標會給我以後打開時的錯誤 – HDB

+0

@HDB - 我向您展示了一個完整的腳本,您可以在空白數據庫中運行並觀察結果。它已經過測試(底部顯示的結果來自SQL Server 2012)。我不知道上面的代碼與你的實際代碼有什麼不同,因爲你是目前唯一可以確定的人。 –

相關問題