SQL Server存储过程返回正确的行数,但所有行都相同

时间:2014-10-08 20:28:52

标签: sql-server-2008 stored-procedures ssms

不确定问题出在哪里...我写了一个存储过程(在SQL Server Mgmt.Studio中执行时)返回我希望看到的结果:

USE [DataViewer]
GO
/****** Object:  StoredProcedure [dbo].[DV_GetPSCTreeNodes]    Script Date: 08/10/2014 1:48:03 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


-- =============================================
-- Author:      <Me!>
-- Description: <Used by data viewer GUI.>
-- =============================================
ALTER PROCEDURE [dbo].[DV_GetPSCTreeNodes]
    -- Add the parameters for the stored procedure here

    @iNodeLevel int,
    @iParentNodeId bigint

AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @sQuery varchar (2000)

    IF @iNodeLevel >= 5

    RETURN

    ELSE

    -- Insert statements for procedure here
    SET @sQuery = 'SELECT * FROM DataView.dbo.v_Tree
    WHERE L' + CAST((@iNodeLevel + 1) AS VARCHAR(10)) + 'ID IS NULL
    AND L' + CAST((@iNodeLevel) AS VARCHAR(10)) + 'ID = ' + CAST((@iParentNodeId)
    AS VARCHAR(10))

    EXEC (@sQuery)
END

如上所述,如果我在SMSS中运行它,我会得到预期的结果。

但是,如果我通过我设置的服务运行它,我会得到正确数量的记录,但它们都是第一行的重复(我可以看一下表,知道我得到的重复) 。如果我尝试新的params并在SSMS中返回15个不同的行,我的网页将显示15行重复的第1行数据。

以下是我客户的电话:

List<v_PowerSystemCIMTree> list = null;
DVServiceClient proxy = new DVServiceClient();

try
{
    list = proxy.DV_GetPSCTreeNodes(2,325550).ToList(); //2 and 325550 are just hardcoded to 
                                                        //check to see if it's working
}
catch (Exception ex)
{
    Console.WriteLine(ex.GetType().FullName);
    Console.WriteLine(ex.Message);
}
finally
{
    proxy.Close();
}
return View(list);

哪个叫我的服务:

readonly DataViewerEntities _Context = new DataViewerEntities();

public List<DataViewer_DAL.v_PowerSystemCIMTree> DV_GetPSCTreeNodes(int firstParam,
long secondParam)
{
    return _Context.DV_GetPSCTreeNodes(firstParam,secondParam).ToList();
}

为什么我会在Management Studio中获得一个结果集,但在我的网页上重复数据?

1 个答案:

答案 0 :(得分:3)

已知问题:由于您从视图中选择了没有定义的主键,因此实体框架将使用所有非可空的列为&#34;实体键&#34;。

如果EF从具有相同实体键的视图中读取第二行(所有非可空列中的值相同),它将只重复已读取的第一行 - 它将查看其他剩下的栏目....

因此,您只需要将基础表的主键添加到视图列中,将EF数据模型调整为显式定义&#34;实体密钥&#34;对于视图,或者您需要在视图中添加一个人工的,唯一的列(如ROW_NUMBER()),并确保它不可为空,因此是EF&#34;衍生的&#34的一部分;实体密钥