Могу ли я использовать SQL рекурсив в SQL курсор? - PullRequest
1 голос
/ 27 марта 2019

Я пишу процедуру, которая хочет рекурсивно выполнить функцию в курсоре с помощью mssql.

Функция ParseJson в следующем коде относится к Как рекурсивно анализировать строку JSON с помощьюopenjson

PS.Справочный пример - рекурсивная версия, но в моем вопросе это пошаговый анализ.

Это первый результат моей функции ParseJson

    topKey     Key         isTerminal     Value
    Book       IssueDate   1              02-15-2019
    Book       Detail      0              { "Type":"Any Type", "Author":{ "Name":"Annie" , "Sex":"Female"}
    Book       Chapter     0              [{ "Section":"1.1", "Title":"Hello world." }, { "Section":"1.2", "Title":"Be happy." }]
    Book       Sponsor     0              ["A","B","C"]

Значение каждого столбца isTerminalэто условие, когда isTerminal=0 затем выполняет функцию ParseJson;когда isTerminal=1, затем что-то напечатать.

Я создаю процедуру для рекурсивного выполнения функции в SQL-курсоре.Функция создания успешна, но исключительная ошибка.

create procedure CursorJson
    @json nvarchar(max)
    , @Type nvarchar(max) 
    , @isArray bit = 0
as
begin

    set nocount on

    declare 
        @TopKey nvarchar(4000)
        , @Key nvarchar(4000)
        , @IsType bit
        , @IsList bit
        , @isTerminal bit
        , @Value nvarchar(4000)

    --defind
    declare myCursor cursor for

    --dataset
    select * from ParseJson(@json, @Type, @isArray) 

    --open
    open myCursor

    --run
    fetch next from myCursor into 
            @TopKey nvarchar(4000)
            , @Key nvarchar(4000)
            , @IsType bit
            , @IsList bit
            , @isTerminal bit
            , @Value nvarchar(4000)

    while(@@fetch_status = 0)
    begin
        if @isTerminal = 0 
        begin
            set @json = '{"' + @Key + '":' + @Value + '}'
            exec CursorJson @json, @Key, @isList 
        end
        else
        begin
            print 'insert...'
        end

        fetch next from myCursor into 
                @TopKey nvarchar(4000)
                , @Key nvarchar(4000)
                , @IsType bit
                , @IsList bit
                , @isTerminal bit
                , @Value nvarchar(4000)
    end

    --close and deallocate
    close myCursor 
    deallocate myCursor

    return
end
declare @Type nvarchar(max)=N'Book'
declare 
    @json nvarchar(max)=N'{
    "Book":{
        "IssueDate":"02-15-2019"
        , "Detail":{
            "Type":"Any Type"
            , "Author":{
                "Name":"Annie"
                , "Sex":"Female"
            }
        }
        , "Chapter":[
            {
                "Section":"1.1"
                , "Title":"Hello world."
            }
            ,
            {
                "Section":"1.2"
                , "Title":"Be happy."
            }       
        ]
        , "Sponsor":["A","B","C"]
    }
}'  

--exec
exec CursorJson @json, @Type, 0

Программа CursorJson, [Batch Start Line 0] Курсор с именем 'myCursor' уже существует.

1 Ответ

1 голос
/ 27 марта 2019

«Быстрое исправление» будет означать, что курсор является локальным :

declare myCursor cursor local for

Но я бы серьезно пересмотрел, сможете ли вы добиться того, что пытаетесьсделать, используя взамен рекурсивный CTE .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...