Sql server 如何在一个视图/控制器中使用具有联接表的多个存储过程?

Sql server 如何在一个视图/控制器中使用具有联接表的多个存储过程?,sql-server,asp.net-mvc,linq,stored-procedures,Sql Server,Asp.net Mvc,Linq,Stored Procedures,我已经创建了多个包含连接操作的存储过程。我试图在我的ASP.NET MVC应用程序中使用这些存储过程,但它不起作用。我在单视图上调用这些存储过程。我正在使用实体框架来连接数据库 基本上,我必须根据特定条件调用这些存储过程,这意味着必须在单个视图上在存储过程之间切换 有人想到在一个视图中调用这样的存储过程吗 以下是我的两个存储过程: CREATE PROCEDURE sp_GetTotalRecordsByAccountNumber @branch varchar(4), @bas

我已经创建了多个包含连接操作的存储过程。我试图在我的ASP.NET MVC应用程序中使用这些存储过程,但它不起作用。我在单视图上调用这些存储过程。我正在使用实体框架来连接数据库

基本上,我必须根据特定条件调用这些存储过程,这意味着必须在单个视图上在存储过程之间切换

有人想到在一个视图中调用这样的存储过程吗

以下是我的两个存储过程:

CREATE PROCEDURE sp_GetTotalRecordsByAccountNumber
    @branch varchar(4),
    @basic varchar(6),
    @suffix varchar(3)
AS 
BEGIN
    SELECT
        Date AS 'Date',
        desc1 + RTRIM(LTRIM(ISNULL(desc2, ''))) + '' +
                RTRIM(LTRIM(ISNULL(desc2, ''))) AS 'Description',
        ISNULL(CASE WHEN Amount < 0 THEN (Transactionamt / Currency) END, 0) AS Debit,
        ISNULL(CASE WHEN Amount > 0 THEN (Transactionamt / Currency) END, 0) AS Credit,
        (TotalAmount / currency) AS Balance
    FROM
        tbl1
    LEFT OUTER JOIN 
        tbl2 ON tbl1.accountnumber = tbl2.accountnumber
    LEFT OUTER JOIN 
        tbl3 ON tbl1.currency = tbl3.currency
    LEFT OUTER JOIN 
        tbl4 ON tbl1.accountName = tbl4.accountName
    WHERE
        branch = @branch 
        AND basic = @basic 
        AND suffix = @suffix
    ORDER BY 
        date 
END

CREATE PROCEDURE sp_GetTotalRecordsByDates
    @branch varchar(4),
    @basic varchar(6),
    @suffix varchar(3),
    @startdate datetime,
    @enddate datetime
AS
BEGIN
    SELECT 
        Date AS 'Date',
        desc1 + RTRIM(LTRIM(ISNULL(desc2, ''))) + '' +
                RTRIM(LTRIM(ISNULL(desc2, ''))) AS 'Description',
        ISNULL(CASE WHEN Amount < 0 THEN (Transactionamt/Currency) END, 0) AS Debit,
        ISNULL(CASE WHEN Amount > 0 THEN (Transactionamt/Currency) END, 0) AS Credit,
        (TotalAmount/currency) AS Balance
    FROM
        tbl1
    LEFT OUTER JOIN 
        tbl2 ON tbl1.accountnumber = tbl2.accountnumber
    LEFT OUTER JOIN 
        tbl3 ON tbl1.currency = tbl3.currency
    LEFT OUTER JOIN 
        tbl4 ON tbl1.accountName = tbl4.accountName
    WHERE 
        branch = @branch 
        AND basic = @basic 
        AND suffix = @suffix
        AND date BETWEEN @startdate AND @enddate
    ORDER BY 
        date date
END
我的看法是:

@model IEnumerable<ComplexStoredProceduremvc.Models.sp_GetTotalRecordsByAccountNumber_Result>
@model IEnumerable
这里,它只按帐号提供数据如果我想按日期获取数据,那么我必须更改存储过程名称,这不是正确的选项


我希望你会得到这个问题…等待一些解决方案…帮助

我想你可以用一个
SP
来处理这两种情况,如下所示

CREATE PROCEDURE sp_GetTotalRecordsByDates
@branch varchar(4)='0',
@basic varchar(6)='0',
@suffix varchar(3)='0',
@startdate datetime=null,
@enddate datetime=null
AS
BEGIN
SELECT 
    Date AS 'Date',
    desc1 + RTRIM(LTRIM(ISNULL(desc2, ''))) + '' +
            RTRIM(LTRIM(ISNULL(desc2, ''))) AS 'Description',
    ISNULL(CASE WHEN Amount < 0 THEN (Transactionamt/Currency) END, 0) AS Debit,
    ISNULL(CASE WHEN Amount > 0 THEN (Transactionamt/Currency) END, 0) AS Credit,
    (TotalAmount/currency) AS Balance
FROM
    tbl1
LEFT OUTER JOIN 
    tbl2 ON tbl1.accountnumber = tbl2.accountnumber
LEFT OUTER JOIN 
    tbl3 ON tbl1.currency = tbl3.currency
LEFT OUTER JOIN 
    tbl4 ON tbl1.accountName = tbl4.accountName
WHERE 
    (branch = @branch or @branch='0')
    AND (basic = @basic or @basic='0')
    AND (suffix = @suffix or @suffix ='0')
    AND (date >= @startdate or @startdate is null)
    AND (date <= @enddate or @enddate is null)
ORDER BY 
    date
END
创建过程sp_GetTotalRecordsByDates
@分支varchar(4)='0',
@基本varchar(6)='0',
@后缀varchar(3)=“0”,
@startdate datetime=null,
@enddate datetime=null
作为
开始
挑选
日期为“日期”,
desc1+RTRIM(LTRIM(ISNULL(desc2'))+“”+
RTRIM(LTRIM(ISNULL(desc2'))作为“说明”,
ISNULL(金额小于0时,则(交易金额/货币)结束,0)作为借方,
ISNULL(金额大于0时,则(交易金额/货币)结束,0)作为贷方,
(总金额/货币)作为余额
从…起
tbl1
左外连接
tbl1.accountnumber上的tbl2=tbl2.accountnumber
左外连接
tbl1.currency上的tbl3=tbl3.currency
左外连接
tbl1.accountName=tbl4.accountName上的tbl4
哪里
(分支=@branch或@branch='0')
和(basic=@basic或@basic='0')
和(后缀=@suffix或@suffix='0')
和(日期>=@startdate或@startdate为空)

及(日期提示:您不应该在存储过程中使用
sp_
前缀。Microsoft已经这样做了,而且您在将来的某个时候确实会面临名称冲突的风险。最好只是避免使用
sp_
而使用其他前缀,或者根本不使用前缀!我看不出这些存储过程存在的任何原因。您可以通过LINQ创建IQuerybale等价物并在代码中重用它们。请您更清楚地解释一下您得到了什么结果以及想要得到什么结果?存储过程与您的问题有什么关系?不管您使用什么,在任何情况下,您都必须从服务器获取数据或获取两组数据并使用javascript。@SvyatoslavDanyl我已经创建了存储过程来根据帐号和日期获取数据。在我的控制器中,我必须设置一个条件来检查用户是否需要按帐号或日期获取数据。在此基础上,我们在视图中得到结果。但问题是,我不能在单个视图中调用两个存储过程,以便它可以相应地切换。
CREATE PROCEDURE sp_GetTotalRecordsByDates
@branch varchar(4)='0',
@basic varchar(6)='0',
@suffix varchar(3)='0',
@startdate datetime=null,
@enddate datetime=null
AS
BEGIN
SELECT 
    Date AS 'Date',
    desc1 + RTRIM(LTRIM(ISNULL(desc2, ''))) + '' +
            RTRIM(LTRIM(ISNULL(desc2, ''))) AS 'Description',
    ISNULL(CASE WHEN Amount < 0 THEN (Transactionamt/Currency) END, 0) AS Debit,
    ISNULL(CASE WHEN Amount > 0 THEN (Transactionamt/Currency) END, 0) AS Credit,
    (TotalAmount/currency) AS Balance
FROM
    tbl1
LEFT OUTER JOIN 
    tbl2 ON tbl1.accountnumber = tbl2.accountnumber
LEFT OUTER JOIN 
    tbl3 ON tbl1.currency = tbl3.currency
LEFT OUTER JOIN 
    tbl4 ON tbl1.accountName = tbl4.accountName
WHERE 
    (branch = @branch or @branch='0')
    AND (basic = @basic or @basic='0')
    AND (suffix = @suffix or @suffix ='0')
    AND (date >= @startdate or @startdate is null)
    AND (date <= @enddate or @enddate is null)
ORDER BY 
    date
END