2010-08-25 44 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