Где в хранимой процедуре
У меня есть 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, смотрите этот ответ.