Где в хранимой процедуре

У меня есть 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, 5 PersonId, поэтому, присоединившись к 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)

так что я могу получить PersonId 2, 5 и тд.

1 ответ

Вы можете передать список значений хранимой процедуре... вы просто не можете сделать это так, как делаете!

Невозможно объявить параметр "макрос". Параметр должен быть привязан к одному объекту; его нельзя использовать для генерации оператора 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

И чтобы использовать эту процедуру через Entity-Framework, смотрите этот ответ.

Другие вопросы по тегам