1

我有一个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, 5PersonId,所以通过加入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)

所以我可以得到PersonId2、5等等。

4

1 回答 1

3

可以将值列表传递给存储过程......您不能按照您的方式进行操作!

不能声明“宏”参数。参数必须绑定到单个对象;它不能用于生成 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

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

于 2013-03-25T21:21:49.857 回答