在存储过程中的位置

时间:2013-03-25 21:08:27

标签: 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)

我想使用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 个答案:

答案 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。