Я пишу процедуру, которая хочет рекурсивно выполнить функцию в курсоре с помощью 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' уже существует.