C# 在存储过程中的什么位置

C# 在存储过程中的什么位置,c#,.net,stored-procedures,entity-framework-5,sql-server-2012,C#,.net,Stored Procedures,Entity Framework 5,Sql Server 2012,我有一个类似的myStoreProcedure @personId VARCHAR(MAX) SELECT IdNo, LastName + ', ' + FirstName + ' ' + MiddleName AS Name FROM Person WHERE CAST(Person.PersonId AS varchar(max)) in (@personId) 我想使用WHERE IN列出基于PersonId的所有人员,但数据类型是varchar。到目前为止,这

我有一个类似的
myStoreProcedure

@personId VARCHAR(MAX)

SELECT IdNo, LastName + ', ' + FirstName + ' ' + MiddleName AS Name
FROM            Person
WHERE CAST(Person.PersonId AS varchar(max)) in (@personId)
我想使用
WHERE IN
列出基于
PersonId
的所有人员,但数据类型是
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'”您可以将值列表传递给存储过程。。。你就是不能这样做

无法声明“宏”参数。参数必须绑定到单个对象;它不能用于生成SQL语句。这正是您想要做的:您试图将整个
IN
子句传递给存储过程,这是绝对不允许的

(当然,也许您可以通过使用动态执行来做到这一点。但请不要在生产数据库上尝试,性能会很糟糕…:-/)

如果我必须做类似的事情,我会使用:


为了通过实体框架使用该过程,请参见答案。

PersonID是一个varchar字段还是一个数值字段?是一个Int数据类型,这是我对
Person
表的主键,我正在尝试转换为varchar,以便使用
Where in
。这是我的建议,我也可以建议你避免这种方式。您可以尝试@rsenna sution,或者尝试在选择之前填充临时表-在相同的连接/事务中。+1感谢您的回答我有了一些好主意,但同时,我会在检查是否已接受之前先尝试它。
:D
除非必要,否则我不会使用动态SQL,但主要是因为风险和调试复杂性,而不是性能。有一个表演开销,但它主要是一个古老的故事。请看我的道歉,但我使用
dbContext.Database.SqlQuery(stringsql)
来解决我的问题,再次感谢:)@Kirk Broadhurst:IMHO说动态sql执行成本“可以忽略不计”是天真的。您显示的页面只考虑单个语句的纯执行时间!不考虑并发、重新编译、参数嗅探、计划缓存膨胀等。是的,动态执行可以是一个选项,如果且仅当使用了参数嗅探,并且减少了查询重新编译(OP的解决方案并非如此)。坦率地说,你的建议充其量听起来很业余(当然,除非我们不是在讨论现实世界中的多用户场景)。
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