Как использовать очень длинный JSON в качестве текстового параметра в Power Shell? - PullRequest
0 голосов
/ 19 марта 2019

TL; DR: я переполняю строковый параметр JSON длиной более 500 тыс. Символов.

Я использую решение на основе Azure для:

  1. В приложениях логики,просмотрите список списков SharePoint, хранящихся на более чем 200 дочерних сайтах SharePoint.
  2. Отправьте HTTP-запрос в SharePoint API и загрузите каждый список в виде JSON.
  3. Вызовите хранимую процедуру в базе данных SQL, которая преобразует и загружаетданные в базу данных.

После некоторых проблем с шагом 3, а именно из-за проблем с тайм-аутом соединения между приложениями логики, я добавил шаг:

2.5: вызовАвтоматизация Runbook, которая вызывает хранимую процедуру без истечения времени ожидания.Это основано на этом решении .По сути, это сценарий PowerShell, который создает соединение ADO.NET с базой данных SQL Azure, а затем выполняет хранимую процедуру, а параметры SP, в свою очередь, запрашиваются в качестве параметров в приложениях логики.Например:

enter image description here

Но с несколькими списками я получаю сообщение об ошибке, указывающее, что я перебрал ограничение на количество символов в строке PowerShellпеременная:

{
  "code": "BadRequest",
  "message": "{\"Message\":\"The request is invalid.\",\"ModelState\":{\"job.properties.parameters\":[\"Job parameter values too long. Max allowed length:524288. Parameter names: Json\"]}}"
}

Вот суть этого: «Значения параметров задания слишком длинные. Максимально допустимая длина: 524288. Имена параметров: Json».Этот параметр объявлен в Power Shell следующим образом:

[parameter(Mandatory=$True)]
[string] $Json,   

Есть ли другой тип данных, который я мог бы объявить для этого, который не попадал бы в это ограничение?

1 Ответ

0 голосов
/ 28 марта 2019

Следуя предложению Дэвида Брауна о комментариях, я передал свои большие JSON-ответы из SharePoint API в хранилище BLOB-объектов, а затем передал SAS URI BLOB-объекта в качестве параметра для хранимой процедуры. У меня также были некоторые проблемы с авторизацией при выполнении этой процедуры, и решение, на которое мне указал мой начальник, было создание Мастер Ключа. Это было выполнено один раз:

USE ***DataBase***
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '123'
GO

И затем в хранимой процедуре часть, связанная с открытием содержимого Blob и чтением его в табличную переменную и, наконец, в текстовую переменную, была обернута в OPEN MASTER KEY - CLOSE MASTER KEY:

SET @vURI = '***Json BLOB URI***'
SET @SplitChar = CHARINDEX('?', @vURI)
SET @vFileName = REPLACE(SUBSTRING(@vURI, 1, @SplitChar -1),'https://***StorageAcc***.blob.core.windows.net/***ContainterName***/','')

OPEN MASTER KEY DECRYPTION BY PASSWORD = '123'  

SET @vSQL = 'ALTER DATABASE SCOPED CREDENTIAL dbscopedcredential WITH IDENTITY = ''SHARED ACCESS SIGNATURE'',
            SECRET = ''***BLOB AUTHENTICATION***'';'
EXEC sp_executesql @stmt = @vSQL    

SET @vSQL = '
        DECLARE @vTable TABLE (BulkColumn NVARCHAR(MAX));
        INSERT INTO @vTable 
        SELECT * FROM OPENROWSET(
        BULK  ''' + @vFileName + ''',
        DATA_SOURCE = ''externaldatasource_import'', 
        SINGLE_CLOB) AS DataFile;
        SELECT * FROM @vTable
        '
INSERT INTO @vTable
EXEC sp_executesql @stmt = @vSQL

SELECT @vJson = [BulkColumn] FROM @vTable   

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