3

DocumentDB でストアド プロシージャを作成し、後で必要なときにいつでも使用したいと考えています。ストアド プロシージャを実行するには、storedProcedureLink を知る必要があります。CreateStoredProcedureAsync メソッドでストアド プロシージャを登録すると、リンクが表示されます。後でこのストアド プロシージャを実行する場合、このリンクを自分のどこかに保存する必要がありますか? プロシージャ名しか知らない場合、ストアド プロシージャを実行できますか? 私が見つけたすべての例から、ストアド プロシージャを実行する直前に作成して登録する必要があるようですが、そうですか?

4

5 に答える 5

2

私が見つけたすべての例から、ストアド プロシージャを実行する直前に作成して登録する必要があるようですが、そうですか?

いいえ。ストアド プロシージャの作成と登録は、実行中に行う必要はありません。

サンプルは教育用ですが、実際のパターンは提供していません。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;
    }
于 2015-09-30T18:54:13.563 に答える
0

このアプローチを試してみましたが、うまくいきません。

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"
}
于 2014-09-11T19:37:26.760 に答える
0

.NET SDK で最初に DB で SP を探すことができます。

StoredProcedure storedProcedure = Client.CreateStoredProcedureQuery(GetCollection(eColl).SelfLink).Where(c => c.Id == "SP name").AsEnumerable().FirstOrDefault();
于 2016-03-27T12:32:49.093 に答える