2014-09-11 3 views
3

DocumentDB에서 저장 프로 시저를 만들고 나중에 필요할 때마다 사용하고 싶습니다. 저장 프로 시저를 실행하려면 storedProcedureLink를 알아야합니다. CreateStoredProcedureAsync 메서드를 사용하여 저장 프로 시저를 등록 할 때 링크를 얻습니다. 나중에이 저장 프로 시저를 실행하려면이 링크를 어딘가에 저장해야합니까? 내가 알고있는 것이 프로 시저 이름이라면 저장 프로 시저를 실행할 수 있습니까? 모든 예제에서 나는 그것을 실행하기 전에 스토어드 프로 시저를 생성하고 등록해야하는 것처럼 보였다.DocumentDB에서 기존 저장 프로 시저를 실행하는 방법?

답변

0

방금 ​​시도했지만 작동하지 않습니다.

client.CreateStoredProcedureQuery(link, String.Format("select * from root r where r.id = '{0}'", "spname1")).ToList().FirstOrDefault(); 

수익률은 내가 필요 직전에 저장 프로 시저를 작성하고 등록해야 것 같다

client.CreateStoredProcedureQuery(link, String.Format("select * from root r")).ToList().FirstOrDefault(); 

반환 내가 찾은 모든 예제에서 절차

{ 
    "id": "spname1", 
    "body": "function() { 
     var context = getContext(); 
     var collection = context.getCollection();  
    }", 
    "_rid": "XXX", 
    "_ts": 1410449011.0, 
    "_self": "XXX", 
    "_etag": "XXX" 
} 
+0

나는'client.CreateStoredProcedureQuery (link, String.Format ("root * r.id = '{0}'", "spname1")) .ToList() .FirstOrDefault(); id = '{0}'대신 id = 'spname1'인 저장 프로 시저; 대신'r.id = 'spname''을 쿼리해야합니다. –

+0

string.format이 DocumentDB로 보내기 전에 적절한 문자열을 생성하므로 의미가 없습니다. – Maxim

+0

아, 네 말이 맞아! 흥미롭게도 필자는 복사하여 붙여 넣기 만하고 client.CreateStoredProcedureQuery (r.id = '{0}', "spname1")) .ToList()를 사용하여 링크, String.Format ("select * FirstOrDefault();'그리고 내 저장 프로 시저를 반환했습니다. 더 많은 컨텍스트를 제공하기 위해 더 큰 코드 스 니펫을 게시 할 수 있습니까? –

5

저장 프로 시저를 미리 만들어서 나중에 사용할 수 있도록 서버에 저장해야합니다. 그것을 사용하기 바로 전에 그것을 생성 할 필요는 없습니다. 이는 샘플 목적으로 만 사용되었습니다. 저장 프로 시저가 이미 존재하고 응용 프로그램에서 사용하는 대부분의 시간을 기대합니다.

저장 프로 시저를 실행하려면 SelfLink가 필요합니다. 이 작업을 수행하는 한 가지 방법은 저장 프로 시저 (이름순)를 쿼리하고 SelfLink를 가져온 다음 저장 프로 시저를 실행하는 것입니다.

이름으로 저장 프로 시저를 쿼리하면 다음과 같은 식으로 표시됩니다.

StoredProcedure sproc = client.CreateStoredProcedureQuery(collection.StoredProceduresLink, "select * from root r where r.id = \"sproc name\""); 

결과로 생성되는 sproc 변수에는 실행하려는 저장 프로 시저의 SelfLink가 포함됩니다. 에 게시 된 샘플에서 DocumentDB.Samples.ServerSideScripts 프로젝트를 참조하십시오 저장 프로 시저와 함께 작동하는 방법에 대한 포괄적 인 샘플에 대한

var result = client.ExecuteStoredProcedureAsync(sproc.SelfLink); 

; http://code.msdn.microsoft.com/Azure-DocumentDB-NET-Code-6b3da8af

+1

왜 이렇게 찾기가 어렵습니까? 내가 발견 한 모든 예는 ab 밖으로 sprocs 만들기 및 가장 일반적인 시나리오를 설명하는 첫 번째 == sproc 실행 및 데이터 가져 오기 ... –

+0

만약 내가'StoredProcedure sproc = client.CreateStoredProcedureLink (collection.StoredProceduresLink "select * Visual Studio 2015에서 컴파일러가 불평 * "System.Linq.IQueryable "형식을 'Microsoft.Azure.Documents.StoredProcedure'로 암시 적으로 변환 할 수 없음 * – sh1rts

+1

Ryan CrawCour, 감사합니다. 대답은. 견본은 지금 404 's를 연결한다. –

2

을 저장 올바른 널 (null) 그것을 실행하려면, 그럴까요?

아니요. 저장 프로 시저 생성 및 등록은 실행 중에 수행 할 필요가 없습니다.

샘플은 교육용이지만 실제 패턴을 제공하지는 않습니다. DocumentManagement basic CRUD operations을 참조하십시오. 샘플 역시 단일 콜렉션을 가정합니다. Partitioning basic CRUD operations을 참조하십시오.

SQL 코딩 규칙의 DocumentDB 적응에 대해 박수를 보내며, 의 사용 패턴은 현재이며 .NET 개발자에게는 적합하지 않습니다. SQL Server에서 CRUD 저장 프로 시저를 만든 다음 ADO.NET 또는 DataSet의 TableAdapter를 사용하여 이름으로 호출하는 10 년 된 패턴은 DocumentDB에서 작동하지 않습니다.

프로 시저 이름이 아는 경우 저장 프로 시저를 실행할 수 있습니까?

네,하지만 꽤 아니다 :

StoredProcedure storedProcedure = this.DocumentClient.CreateStoredProcedureQuery(new Uri(collection.StoredProceduresLink)).Where(p => p.Id == "GetPunkRocker").AsEnumerable().FirstOrDefault(); 

가 PartitionResolver를 사용하는 경우는 상황이 더 복잡 :

public async Task<PunkRocker> GetPunkRockerAsync(string partitionKey) 
    { 
     foreach (string collectionLink in this.PartitionResolver.ResolveForRead(partitionKey)) 
     { 
      DocumentCollection collection = this.DocumentClient.CreateDocumentCollectionQuery(new Uri(this.Database.SelfLink)).Where(c => c.SelfLink == collectionLink).AsEnumerable().FirstOrDefault(); 

      if (collection == null) 
      { 
       // Log... 
       continue; 
      } 

      StoredProcedure storedProcedure = this.DocumentClient.CreateStoredProcedureQuery(new Uri(collection.StoredProceduresLink)).Where(p => p.Id == "GetPunkRocker").AsEnumerable().FirstOrDefault(); 

      if (storedProcedure == null) 
      { 
       // Log... 
       continue; 
      } 

      PunkRocker punkRocker = await this.DocumentClient.ExecuteStoredProcedureAsync<PunkRocker>(new Uri(storedProcedure.SelfLink), partitionKey); 

      if (punkRocker != null) 
      { 
       return punkRocker; 
      } 
     } 

     return null; 
    } 
+0

그래서 저장 프로 시저가 각 파티션에 대해 한 번 실행됩니까? 저장된 proc 내의 쿼리가 루트에서 select *와 같은 것을하고 처음 세 개를 반환하면 어떻게 될까요? – pfunk

+0

Re : "이름으로 sproc 찾기": 조금 깨끗하지 않습니까? 단점이 있습니까? '_client.ReadStoredProcedureAsync ( ) UriFactory.CreateStoredProcedureUri (databaseId, collectionId, sprocId)' –

0

당신은 .NET에서 먼저 DB에서 SP 찾아보실 수 있습니다 SDK

StoredProcedure storedProcedure = Client.CreateStoredProcedureQuery(GetCollection(eColl).SelfLink).Where(c => c.Id == "SP name").AsEnumerable().FirstOrDefault();