2016-10-20 2 views
0

Мне нужна одна хранимая процедура, которую мне нужно запускать на разных ключах разделов. Моя коллекция разделена на одно ключевое имя сущности, и я хочу выполнить хранимую процедуру для каждого объекта в разделе.ExecuteStoredProcedureAsync запускает его через ключи разделов

sproc = await client.CreateStoredProcedureAsync(collectionLink, sproc, 
    new RequestOptions { PartitionKey = new PartitionKey(partitionkey) }); 

StoredProcedureResponse<int> scriptResult = await client.ExecuteStoredProcedureAsync<int>(
    sproc.SelfLink, 
    new RequestOptions { PartitionKey = new PartitionKey(partitionkey) }, 
    args); 

я получаю следующее исключение:

запросы, исходящие из сценариев не могут ссылаться на другие, чем тот, для которого запрос клиента был представлен

  1. Нужно создать раздел ключей хранимую процедуру в каждом разделе на основе ключа?
  2. Возможно ли иметь одну хранимую процедуру, которая может выполняться для всех ключей?

ответ

1

Когда хранимая процедура выполняется от клиента, RequestOptions задает ключ раздела, хранимая процедура запускается в контексте этого раздела и не может работать (например, создавать) в документах, имеющих разное значение ключа раздела.

Что вы можете сделать, это выполнить sproc от клиента для каждого ключа раздела. Например, если sproc - это объемные документы, вы можете группировать документы с помощью ключа раздела и отправлять каждую группу (может быть сделана параллельно) в значение sproc, предоставляющее ключ раздела в RequestOptions. Будет ли это полезно?

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

+0

Спасибо Майкл. Это решило проблему. –

+0

Мы работаем над хранимой процедурой, которая будет работать через ключи разделов. Будьте на связи. –

0

Я разработал выше в Java.

Существуют различия в том, как мы реализуем при использовании Java SDK и хранимой процедуры.

Обратите внимание на использование «строки» и необходимость разделения записей на основе ключа раздела.

Процедура Bulk Import Магазин используется: https://docs.microsoft.com/en-us/azure/documentdb/documentdb-programming

Ниже клиент вызова процедуры сохранения

public void CallStoredProcedure(Map <String, List<String>> finalMap) 
{ 
    for (String key : finalMap.keySet()) { 
     try 
     { 
      ExecuteStoredProcedure(finalMap.get(key),key); 
     } 
     catch(Exception ex) 
     { 
      LOG.info(ex.getMessage()); 
     } 
    }  
} 
public void ExecuteStoredProcedure(List<String> documents, String partitionKey) 
{ 

    try { 

     if (documentClient == null) { 
      documentClient = new DocumentClient(documentDBHostUrl, documentDBAccessKey, null, ConsistencyLevel.Session); 
     } 

     options = new RequestOptions(); 
     options.setPartitionKey(new PartitionKey(partitionKey)); 

     Object[] sprocsParams = new Object[2] ; 
     sprocsParams[0] = documents; 
     sprocsParams[1] = null; 

     StoredProcedureResponse rs = documentClient.executeStoredProcedure(selflink, options, sprocsParams); 

    } catch (Exception ex) { 

    } 
}