DocumentDB でストアド プロシージャを作成し、後で必要なときにいつでも使用したいと考えています。ストアド プロシージャを実行するには、storedProcedureLink を知る必要があります。CreateStoredProcedureAsync メソッドでストアド プロシージャを登録すると、リンクが表示されます。後でこのストアド プロシージャを実行する場合、このリンクを自分のどこかに保存する必要がありますか? プロシージャ名しか知らない場合、ストアド プロシージャを実行できますか? 私が見つけたすべての例から、ストアド プロシージャを実行する直前に作成して登録する必要があるようですが、そうですか?
5 に答える
私が見つけたすべての例から、ストアド プロシージャを実行する直前に作成して登録する必要があるようですが、そうですか?
いいえ。ストアド プロシージャの作成と登録は、実行中に行う必要はありません。
サンプルは教育用ですが、実際のパターンは提供していません。DocumentManagement の基本的な CRUD 操作を参照してください。サンプルも単一のコレクションを想定しています。パーティショニングの基本的な CRUD 操作を参照してください。
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;
}
このアプローチを試してみましたが、うまくいきません。
client.CreateStoredProcedureQuery( link, String.Format( "select * from root r where r.id = '{0}'", "spname1" ) ).ToList( ).FirstOrDefault( );
null を返します
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"
}
.NET SDK で最初に DB で SP を探すことができます。
StoredProcedure storedProcedure = Client.CreateStoredProcedureQuery(GetCollection(eColl).SelfLink).Where(c => c.Id == "SP name").AsEnumerable().FirstOrDefault();