Я бы предположил, что для этого использовал бы курсор. Я понимаю концепцию, но никогда не применяю ее на практике. Мне было поручено извлекать данные через API из Swagger в SQL Server.
Код отлично работает ниже, если я объявляю переменную @branch
, но я очень сопротивляюсь ленивому подходу, копируя код 17 раз и меняя переменную @branch
для вставки в таблицу, как я хотел бы автоматизировать процесс на будущее, когда новые филиалы появятся на борту
У меня есть таблица с именем dbo.branches
, которая выглядит следующим образом:

Код, упомянутый выше, который отлично работает, это
DECLARE @Object AS INT;
DECLARE @hr AS INT
DECLARE @json AS TABLE (Json_Table NVARCHAR(MAX))
DECLARE @URL AS NVARCHAR(MAX)
DECLARE @branch AS NVARCHAR(MAX)
DECLARE @shortname AS NVARCHAR(MAX)
DECLARE @api_key AS NVARCHAR(MAX)
DECLARE @start_date AS DATE
DECLARE @offset AS INT
DECLARE @count AS INT
SET @api_key = '123456'
SET @shortname = 'abcd'
SET @branch = '0004-888c'
SET @offset = 0
SET @start_date = convert(char(10),getdate()-90,126)
SET @count = 1000
SET @URL= CONCAT('https://*************/',@shortname,'/********?branchID=',@branch,'&startDate=',@start_date,'&offset=',@offset,'&count=',@count,'&api_key=',@api_key)
Exec @hr=sp_OACreate 'MSXML2.ServerXMLHTTP.6.0', @Object OUT;
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object
Exec @hr=sp_OAMethod @Object, 'open', NULL, 'get',@URL,'false'
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object
Exec @hr=sp_OAMethod @Object, 'send'
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object
Exec @hr=sp_OAMethod @Object, 'responseText', @json OUTPUT
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object
INSERT INTO @json (Json_Table)
EXEC sp_OAGetProperty @Object, 'responseText'
SELECT * FROM @json
INSERT INTO dbo.mortgages
SELECT *
FROM OPENJSON((select * from @json), N'$.Data')
WITH
([Amount] DECIMAL(8,2) N'$.Amount',
[Borrower_Account_Name] NVARCHAR(MAX) N'$.BorrowerAccountName',
[Created_At] DATETIME2 N'$.CreatedAt',
[Extra_Notes] NVARCHAR(MAX) N'$.ExtraNotes',
[Interest_Rate] NVARCHAR(MAX) N'$.IntrestRate',
[Market_Value] DECIMAL(8,2) N'$.MarketValue',
[Monthly_Payment] DECIMAL(5,2) N'$.MonthlyPayment',
[Mortgage_Account_Number] NVARCHAR(MAX) N'$.MortgageAccountNumber',
[Mortgage_Provider] NVARCHAR(100) N'$.MortgageProvider',
[Property_Ownable_ID] NVARCHAR(MAX) N'$.PropertyOwnableID',
[Sales_Instruction_ID] NVARCHAR(5) N'$.SalesInstructionID',
[Type] NVARCHAR(MAX) N'$.Type',
[Valuation_Date] DATETIME2 N'$.ValuationDate'
)
Я хотел бы добиться, чтобы OID из dbo.branches передавался в @branch, который завершит цикл @URL, чтобы вставить вывод JSON в dbo.mortgages для каждого OID в dbo.branches
У меня также было в черепе, что мне понадобится row_number в dbo.branches, поэтому, когда он делает цикл, он знает, когда остановиться?
большое спасибо за любую помощь!