2010-08-25 64 views
0

我可以使用變量來聲明遊標嗎?t-sql動態遊標

我想創建動態遊標,我該怎麼做?

問候

我有表: CREATE TABLE [UsersUniTask]( [ID]唯一標識符約束[DF_UsersUniTask_id] DEFAULT NEWID()NOT NULL, [userUniID]唯一標識符NOT NULL, [TASKID]詮釋NOT NULL, [時間]日期時間NOT NULL, [doTask]詮釋NOT NULL, [優先]詮釋NOT NULL, 約束[PK_UsersUniTask] PRIMARY KEY CLUSTERED([ID]), 約束[FK_UsersUniTask_UsersUni]外鍵([userUniID ]) REFERENCES [UsersUni]([id]) ON UPDATE NO ACTION ON DELETE CASCADE ) ON [PRIMARY] GO

回答

2

你能解釋一下你的意思?如果你在談論在下面的例子在動力方面宣佈光標,然後是你可以:

DECLARE @i int -- variable input 
DECLARE @valuableData int 

SET @i = 1 -- value for that input, this could be set by a query 

DECLARE cursorFoo CURSOR FOR 
    SELECT valuableData 
    FROM myTable 
    WHERE someParameter = @i 

OPEN cursorFoo 

WHILE (1=1) 
BEGIN 
    FETCH NEXT FROM cursorFoo 
     INTO @valuableData 

    IF (@@FETCH_STATUS <> 0) BREAK 

    SELECT @valuableData -- Do something with your data 
END 

CLOSE cursorFoo 

EDIT由於意見

討論,你應該有在這裏兩個獨立的程序循環

環路1:

  1. Webservice的增加任務永久 表上的優先級信息。

迴路2:

  1. 服務器的腳本查詢永久 表中最重要的任務
  2. 服務器的腳本從 表和流程任務(或手 刪除任務開了個腳本 信息做的工作
  3. 服務器腳本返回到永久 表並尋找最重要的 任務

SQL旨在存儲數據,而不是循環並處理它。處理應該使用服務器腳本完成。該腳本應該從數據庫中獲取數據。當SQL正在編寫和讀取並同時在同一個臨時表中循環時,您開始具有併發問題。您可以使用SQL進行處理,但只應使用臨時表來處理僅與特定進程相關的數據。

+0

我有遊標的重複性過程,並且我得到一個遊標存在的錯誤,我想創建動態遊標。我必須創建遊標的動態名稱,這是唯一的。我想要這樣做: 聲明@CursorName nvarchar(500) set @CursorName ='AddTaskCursor'; DECLARE @CursorName CURSOR FAST_FORWARD READ_ONLY FOR ... 但是這樣我不能:( – dzajdol 2010-08-25 08:24:46

+0

不能,你不能動態地聲明一個遊標的名字,你只能動態地定義遊標的參數,如果你在遊標運行後沒有關閉遊標,添加「DEALLOCATE 。CursorName中」您的CLOSE語句後 – Boerema 2010-08-25 08:31:16

+0

我的光標看起來像這樣: DECLARE AddTaskCursor CURSOR FAST_FORWARD READ_ONLY FOR(選擇ID,userUniID,任務id,doTask,優先從@Tasks) 打開AddTaskCursor \t --TODOZROBIĆWYWOŁANIEPROCEDURY - 在這個地方,我用這個遊標執行過程是 - 並且這個過程不能聲明遊標名稱在使用中 關閉AddTaskCursor; DEALLOCATE AddTaskCursor; 正如你看到有我的問題,關閉和釋放 – dzajdol 2010-08-25 08:45:30