порядок по пункту в курсоре - PullRequest
3 голосов
/ 29 апреля 2010

Как заказать данные в курсоре? Можем ли мы использовать order by clause? Потому что мне нужно сначала отсортировать данные.

спасибо

Ответы [ 5 ]

5 голосов
/ 25 июня 2012

Вот так:

DECLARE cur CURSOR FOR
(
    SELECT * FROM 
    (
         SELECT TOP 9999999999 -- Necessary...
              col_1 
             ,... 
             ,col_n 
         FROM TABLE_XY 
         ORDER BY WHATEVER
    ) AS TempTableBecauseSqlServerSucks 
)

Пример из реальной жизни:

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_DELDATA_Delete_NON_SOFT_ByForeignKeyDependency]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[sp_DELDATA_Delete_NON_SOFT_ByForeignKeyDependency]
GO





-- =============================================
-- Author:      Stefan Steiger
-- Create date: 22.06.2012
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[sp_DELDATA_Delete_NON_SOFT_ByForeignKeyDependency]
AS 
BEGIN 
    DECLARE @ThisCmd varchar(500)


    DECLARE cur CURSOR
    FOR 
    (   
        SELECT * FROM 
        (           
            SELECT TOP 9999999999
                -- Lvl
                --,TableName
                --,
                'DELETE FROM [' + TableName + '] WHERE [' + 
                (
                    SELECT 
                        INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME
                    FROM INFORMATION_SCHEMA.COLUMNS  
                    WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = V_DELDATA_Tables_All.TableName 
                    AND INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME LIKE '%Status'
                ) + '] = 99; ' AS cmd

            FROM V_DELDATA_Tables_All
            WHERE (1=1) 
            AND TableName LIKE  'T_%' 
            AND TableName NOT LIKE  'T_Ref_%' 
            AND TableName NOT LIKE  'T_RPT_%' 
            AND TableName NOT LIKE  'T_Import_%' 
            AND TableName NOT LIKE  'T_Export_%' 

            ORDER BY Lvl DESC, TableName ASC 
        ) AS SqlServerSucks

    ) --End For

    OPEN cur 

    FETCH NEXT FROM cur INTO @ThisCmd 
    WHILE @@fetch_status = 0 
    BEGIN 
        PRINT @ThisCmd 
        --EXECUTE(@ThisCmd) 
        FETCH NEXT FROM cur INTO @ThisCmd 
    END 
    CLOSE cur 
    DEALLOCATE cur 

END


GO
3 голосов
/ 29 апреля 2010

Я знаю, что с этим была какая-то проблема, но ее можно решить с помощью

select * from (select a, b from t order by a)
2 голосов
/ 29 апреля 2010

Я не уверен, какую базу данных вы используете, но это возможно в SQL Server.

например ::1003 *

DECLARE vendor_cursor CURSOR FOR 
SELECT VendorID, Name
FROM Purchasing.Vendor
WHERE PreferredVendorStatus = 1
ORDER BY VendorID
1 голос
/ 22 июля 2014

Почему-то другие ответы, основанные на подзапросах, не работали для меня. SQL Server 2012 отбрасывал строки. В этом конкретном случае было выбрано ~ 100 строк из представления некоторых статических данных, пересекаемых с данными таблицы.

Лекарством было объявить курсор как " forward_only static ":

    declare mappingsCursor cursor local forward_only static for
        select top 2000000000
               a, b, c, d
          from MappingsView
         order by a, b, c, d;

Ссылка: Почему курсор, открытый для выбора с помощью ORDER, не отражает обновления в следующей таблице

Кто-нибудь знает тип курсора по умолчанию, когда есть порядок? Почему это не всегда работает для «статических» данных?

0 голосов
/ 12 апреля 2019

У меня была похожая проблема. Я использовал функцию возврата таблицы для CURSOR. в операторе select функции ORDER BY не работал. НО в CURSOR FOR, это сработало.

DECLARE {cursor_name} CURSOR FOR 
  {select_statement | table_return_function} 
  ORDER BY {column_name} ASC|DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...