1

私はmyStoreProcedure好きです

@personId VARCHAR(MAX)

SELECT IdNo, LastName + ', ' + FirstName + ' ' + MiddleName AS Name
FROM            Person
WHERE CAST(Person.PersonId AS varchar(max)) in (@personId)

PersonIdを使用して に基づいてすべての人物をリストしたいのですWHERE INが、データ型はvarcharです。これまでのところ、これは私が試したことです。

var p0 = p.Select(x => new { id = "'" + x.ToString() + "'" })
    .Select(c => c.id).ToArray();    

string personIds1 = string.Join(",", p0);

たとえば、私は2, 5PersonId を持っているので、Idを上記のコードと結合すると、結果は次のようになります。

personIds1 = '2','5'

myStoreProcedureここで、パラメーターを指定してを呼び出すと、結果が得られませんでした。

var list = myEntities.myStoreProcedure(personIds1).Select(t => new PersonEntity
        {
            IdNo = t.IdNo,
            Name = t.Name,
        }).ToList();

私の質問は:

varchar例のように読み取るストアド プロシージャを作成する方法:

--@personId = "'2', '5'" <-just an example
WHERE CAST(Person.PersonId AS varchar(max)) in (@personId)

だから私は2、5などを得ることができますPersonId

4

1 に答える 1

3

値のリストをストアド プロシージャに渡すことはできますが、この方法ではできません。

「マクロ」パラメータを宣言することはできません。パラメータは単一のオブジェクトにバインドする必要があります。SQL ステートメントの生成には使用できません。そして、それはまさにあなたがやろうとしていることです.INストアドプロシージャに句全体を渡そうとしていますが、これは単に許可されていません.

(もちろん、動的実行を使用してそれを行うこともできます。しかし、実稼働データベースではそれを試さないでください。パフォーマンスはひどいものになるでしょう... :-/)

同様のことをしなければならない場合は、テーブル値パラメーターを使用します。

CREATE TYPE [dbo].[IdTable] AS TABLE(
    [Id] [int] NULL
)
GO

CREATE PROCEDURE [dbo].[sp_get_peoplez] (
    @ids IdTable READONLY
) AS
BEGIN
    SELECT IdNo, LastName + ', ' + FirstName + ' ' + MiddleName AS Name
    FROM Person
    WHERE Person.PersonId IN (SELECT Id FROM @ids)
END
GO

そして、エンティティ フレームワークを介してその手順を使用するには、この回答を参照してください。

于 2013-03-25T21:21:49.857 に答える