我有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等等。
答案 0 :(得分:3)
你可以将值列表传递给存储过程......你不能按照你正在做的方式做到这一点!
无法声明“宏”参数。参数必须绑定到单个对象;它不能用于生成SQL语句。这正是你要做的事情:你试图将整个IN
子句传递给存储过程,这是不允许的。
(当然,也许你可以通过使用动态执行来做到这一点。但是,请不要在生产数据库上尝试,性能会很糟糕......: - /)
如果我必须做类似的事情,我会使用table-valued parameter:
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
要通过实体框架使用该程序,请参阅this answer。