Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何根据某些条件更改游标的select语句?_Sql_Sql Server 2008_Tsql - Fatal编程技术网

Sql 如何根据某些条件更改游标的select语句?

Sql 如何根据某些条件更改游标的select语句?,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,有人知道如何为同一个游标设置不同的select语句吗?我需要这样的想法 DECLARE Temp_Cursor CURSOR FOR IF(@TempVar = 1) BEGIN SELECT CustomerId FROM Customers END ELSE IF(@TempVar = 2) BEGIN SELECT OrderId FROM Orders END OPEN Temp_Cursor; FETCH NEXT FROM TempCursor INTO @TempO

有人知道如何为同一个游标设置不同的select语句吗?我需要这样的想法

DECLARE Temp_Cursor CURSOR FOR
IF(@TempVar = 1)
BEGIN
    SELECT CustomerId FROM Customers
END
ELSE IF(@TempVar = 2)
BEGIN
    SELECT OrderId FROM Orders
END
OPEN Temp_Cursor;
FETCH NEXT FROM TempCursor INTO @TempObjectId
WHILE @@FETCH_STATUS = 0
BEGIN 
。。。。等

我找到了解决方案:声明@Temp\u游标 IF@TempVar = 1 开始 设置@Temp\u Cursor=光标 从客户中选择CustomerId 终止 其他的IF@TempVar = 2 开始 设置@Temp\u Cursor=光标 从订单中选择OrderId 终止 打开@Temp_光标; 从@TempCursor获取下一个到@TempObjectId 而@@FETCH\u STATUS=0
开始

完整的查询应该是动态的。这意味着执行计划将在运行时发布

范例

将IF置于外部,并执行两个不同的游标,每种情况一个

像这样:

IF(@TempVar = 1)
BEGIN

    DECLARE Temp_Cursor CURSOR FOR
    SELECT CustomerId FROM Customers


    OPEN Temp_Cursor;
    FETCH NEXT FROM TempCursor INTO @TempObjectId
    WHILE @@FETCH_STATUS = 0
    BEGIN 
    ....
END
ELSE IF(@TempVar = 2)
BEGIN

    DECLARE Temp_Cursor CURSOR FOR
    SELECT OrderId FROM Orders


    OPEN Temp_Cursor;
    FETCH NEXT FROM TempCursor INTO @TempObjectId
    WHILE @@FETCH_STATUS = 0
    BEGIN 
    ....
END

另一种可能是使用。

或者您可以只使用动态SQL…我同意@MitchWheat+1。这也减少了代码行。@Kanavi-这是解决方案。我已经更新了我的问题。如果一个光标在CustomerID或OrderID上进行迭代,而它可能不知道它使用的是哪种类型的ID,那么它是如何有意义/有用的呢?@Radislav,我认为,你已经找到了解决方案,但方向是错误的
IF(@TempVar = 1)
BEGIN

    DECLARE Temp_Cursor CURSOR FOR
    SELECT CustomerId FROM Customers


    OPEN Temp_Cursor;
    FETCH NEXT FROM TempCursor INTO @TempObjectId
    WHILE @@FETCH_STATUS = 0
    BEGIN 
    ....
END
ELSE IF(@TempVar = 2)
BEGIN

    DECLARE Temp_Cursor CURSOR FOR
    SELECT OrderId FROM Orders


    OPEN Temp_Cursor;
    FETCH NEXT FROM TempCursor INTO @TempObjectId
    WHILE @@FETCH_STATUS = 0
    BEGIN 
    ....
END