MSLinqToSqlGenerator如何确定存储过程的返回类型?

时间:2009-07-28 15:48:10

标签: c# visual-studio-2008 sql-server-2005 linq-to-sql

我有一个存储的procudre(SP)如下:


CREATE PROCEDURE [dbo].[UDSPSelectMissing]
    -- paramters omitted
AS
BEGIN 
    -- Code Omitted
    SELECT 
        c.MemberID,
        c.FirstName,
        c.MiddleName,
        c.LastName,
        c.Suffix,
        c.PhoneHome,
        c.PhoneCell,
        c.Email
        FROM [dbo].[Members] c
        WHERE c.MemberID IN (SELECT MemberID FROM #PeopleCameMissing)
        ORDER BY c.LastName,c.FirstName
END

当我将SP添加到“dbml”设计器的SP窗格时,我希望MSLinqToSqlGenerator创建“ISingleResult”作为返回值类型。令我惊讶的是,返回值类型是“int”。显然,生成器使用某些标准来确定返回值类型。我有其他类似的SP返回“ISingleResult”类型。

有人知道会导致生成器以这种方式运行的原因吗?

顺便说一下,这个站点上有人建议重新创建SP,从“dbml”中删除引用,重新启动Visual Studio(VS)并再次将其添加到“dbml”。我经历了这一切无济于事。

我的怀疑在于临时表“#PeopleCameMissing”。

欢迎提出任何意见或建议!

谢谢,

库伦

2 个答案:

答案 0 :(得分:1)

我在原帖中提到我怀疑临时表。临时表是由“SELECT INTO #PeopleCameMissing”命令创建的,因此它的定义是动态的,因此当存储过程添加到“dbml”设计器时,生成器不知道表的定义。如果我让生成器知道表定义怎么办,也许我能够得到所需的返回类型。基于这个猜想,我进行了测试。我声明了一个表如下:


    DECLARE @PeopleCameMissing TABLE(
        MemberID int,
        FirstName nchar(20),
        MiddleName nchar(20),
        LastName nchar(20),
        Suffix nchar(10),
        PhoneHome nchar(20),
        PhoneCell nchar(20),
        Email  nchar(80)
    );

并将原声明改为:


    INSERT INTO @PeopleCameMissing (
        MemberID,
        FirstName,
        MiddleName,
        LastName,
        Suffix,
        PhoneHome,
        PhoneCell,
        Email)
    SELECT 
        c.MemberID,
        c.FirstName,
        c.MiddleName,
        c.LastName,
        c.Suffix,
        c.PhoneHome,
        c.PhoneCell,
        c.Email
        FROM [dbo].[Members] c
        WHERE c.MemberID IN (SELECT a.MemberID FROM #PeopleCameMissing a)
        ORDER BY c.LastName,c.FirstName;

    DROP TABLE #PeopleCameMissing;

    SELECT * 
        FROM @PeopleCameMissing 
        ORDER BY LastName,FirstName;


然后我再次将存储过程添加到“dbml”设计器中。这次生成器创建了所需的返回类型:“ISingleResult”。这似乎证明了我的推测。

答案 1 :(得分:0)

这很简单(在特殊条件下)。

SQL允许您在不调用过程的情况下询问结果集模式。

在不那么特殊的情况下*,SQL会在每次调用时为您提供备用答案。

*有IF语句的人。这可能是故意的。我不太清楚SQL能够回答这个问题。