2014-09-30 66 views
0

我有两个存储过程。第一个存储过程值在第二个存储过程中使用。所以我想将两个存储过程合并为一个。存储过程从SQL Server中的存储过程本身获取值

Create procedure [carcallD] 
    @carid varchar(10) 
as 
Begin 
    select 
     t.dtime, t.locid, t.vtid 
    from 
     Transaction_tbl t 
    where 
     Tbarcode = @carid 
End 

如果我的413carid执行此我会得到了把这样的:

dtime      locid  vtid 
-----------------------  ----------- ----------- 
2014-06-09 14:59:47   5    8 

我的其他存储过程是这样的:

ALTER procedure [dbo].[Weekend] 
    @wday varchar(50), 
    @yr varchar(50), 
    @vtid integer, 
    @locid integer 
as 
begin 
    set nocount on 

    DECLARE @todaysdate date 
    Declare @checkWeekend integer 

    select 
     @todaysdate = CONVERT(varchar(10), GETDATE(), 111) 

    select 
     @checkWeekend = Weekend 
    from 
     weekends_tbl 
    where 
     weekdays = @wday 

    if @checkWeekend = 1 
    begin 
     select Hamount as amount 
     from locvtypeassign_tbl 
     where vtid = @vtid and locid = @locid and active = 0 
    end 
    else 
    begin 
     if @todaysdate in (select Hdate from Pholidays_tbl where year = @yr) 
     begin 
     select Hamount as amount 
     from locvtypeassign_tbl 
     where vtid = @vtid and locid = @locid and active = 0 
     end 
     else 
     begin 
     select Namount as amount 
     from locvtypeassign_tbl 
     where vtid = @vtid and locid = @locid and active = 0 
     end 
    end 
end 

我在这里使用的参数

  • @wday =我想从我的输出传递DTIME的某一天
  • @yr =通过DTIME的特定年份从我的输出
  • @vtid =通VTID从我的输出
  • @locid =通LOCID从我的输出

所以我可以将这两个存储过程合并为一个吗?

如果有人能够帮助我,我会很感激。

在此先感谢

我想输出是这样的:

dtime      locid  vtid   amount 
-----------------------  ----------- ----------- --------- 
2014-06-09 14:59:47   5    8   100 

回答

0

试试这个

ALTER procedure [dbo].[Weekend] 
@carid varchar(50) 
as 
begin 
Declare 
@wday datetime, 
@yr varchar(50), 
@vtid integer, 
@locid integer, 
@day varchar(10), 
@year integer 
-- taking parameter value 
select @wday = t.dtime 
from Transaction_tbl t where [email protected] 
set @day=datename(Weekday,@wday) 
set @year=year(@wday) 
set @vtid = (select t.vtid 
from Transaction_tbl t where [email protected]); 
set @locid = (select t.locid 
from Transaction_tbl t where [email protected]); 
set nocount on 
DECLARE @todaysdate date 
Declare @checkWeekend integer 
select @todaysdate = CONVERT(varchar(10), GETDATE(), 111) 
--End 

--check current day is holiday(Weeknd) 
select @checkWeekend= Weekend from weekends_tbl where [email protected] 
if @checkWeekend= 1 
begin 
Select t.dtime, 
k.HBarcode, m.make,t.Compl, 
t.plateno,t.self,t.dtime, v.vtype, l.locname,case when l.edt is null or l.edt =0 then l.minEdt 
+l.BuffrEDT else l.edt + l.BuffrEDT end as EDT, t.locid,t.vtid,t.lsttic, 
c.Colname, te.UniqueName,DATEDIFF(minute,t.dtime,getdate()) as 
Duration,pl.PS,pc.PlateCode,t.Paid,t.Status,t.DelDate,t.vtid,t.Locid, Hamount as amount 


from Transaction_tbl t 
left JOIN KHanger_tbl k ON t.transactID = k.transactID 
left JOIN make_tbl m ON t.mkid = m.mkid 
left join PlateSource_tbl pl on t.PSID=pl.PSID 
left join PlateCode_tbl pc on t.PCdID=pc.PCdID 
left JOIN vtype_tbl v ON v.vtid = t.vtid 
left JOIN Location_tbl l ON t.locid = l.locid 

left JOIN Color_tbl C ON t.colid = c.colid 
left JOIN Terminals_tbl te ON k.tid = te.tid 
left join locvtypeassign_tbl loc on t.Locid=loc.locid 
where [email protected] and [email protected] and loc.active=0 and [email protected] 
end 
else 
--Check current day belongs to any public holiday 
begin 
if @todaysdate in(select Hdate from Pholidays_tbl where [email protected]) 
begin 

Select t.dtime, 
k.HBarcode, m.make,t.Compl, 
t.plateno,t.self,t.dtime, v.vtype, l.locname,case when l.edt is null or l.edt =0 then l.minEdt  
+l.BuffrEDT else l.edt + l.BuffrEDT end as EDT, t.locid,t.vtid,t.lsttic, 
c.Colname, te.UniqueName,DATEDIFF(minute,t.dtime,getdate()) as 
Duration,pl.PS,pc.PlateCode,t.Paid,t.Status,t.DelDate,t.vtid,t.Locid, Hamount as amount 


from Transaction_tbl t 
left JOIN KHanger_tbl k ON t.transactID = k.transactID 
left JOIN make_tbl m ON t.mkid = m.mkid 
left join PlateSource_tbl pl on t.PSID=pl.PSID 
left join PlateCode_tbl pc on t.PCdID=pc.PCdID 
left JOIN vtype_tbl v ON v.vtid = t.vtid 
left JOIN Location_tbl l ON t.locid = l.locid 

left JOIN Color_tbl C ON t.colid = c.colid 
left JOIN Terminals_tbl te ON k.tid = te.tid 

left join locvtypeassign_tbl loc on t.Locid=loc.locid 
where [email protected] and [email protected] and loc.active=0 and [email protected] 
end 
-- so calculating normal day amount 
else 
begin 

Select t.dtime, 
k.HBarcode, m.make,t.Compl, 
t.plateno,t.self,t.dtime, v.vtype, l.locname,case when l.edt is null or l.edt =0 then l.minEdt 
+l.BuffrEDT else l.edt + l.BuffrEDT end as EDT, t.locid,t.vtid,t.lsttic, 
c.Colname, te.UniqueName,DATEDIFF(minute,t.dtime,getdate()) as  
Duration,pl.PS,pc.PlateCode,t.Paid,t.Status,t.DelDate,t.vtid,t.Locid, Namount as amount 


from Transaction_tbl t 
left JOIN KHanger_tbl k ON t.transactID = k.transactID 
left JOIN make_tbl m ON t.mkid = m.mkid 
left join PlateSource_tbl pl on t.PSID=pl.PSID 
left join PlateCode_tbl pc on t.PCdID=pc.PCdID 
left JOIN vtype_tbl v ON v.vtid = t.vtid 
left JOIN Location_tbl l ON t.locid = l.locid 

left JOIN Color_tbl C ON t.colid = c.colid 
left JOIN Terminals_tbl te ON k.tid = te.tid 

left join locvtypeassign_tbl loc on t.Locid=loc.locid 
where [email protected] and [email protected] and loc.active=0 and [email protected] 
end 
end 
--fetching amount nd details part over--- 
--Checking corresponding barcde complimentry or not.if compl taking deltails 
if(select COUNT(t1.Compl) from dbo.Transaction_tbl t1 where [email protected])=1 
begin 
declare @compl integer =null, 
@transid integer=null, 
@complid integer=null 
select @transid=t.transactID from dbo.Transaction_tbl t where [email protected] 
Select @compl=co.Cmplid from dbo.ComplimentTransactAssign_tbl co where [email protected] 
select c.CompName,c1.Remarks from Complimentary_tbl c 
inner join ComplimentTransactAssign_tbl c1 on c.CmplID=c1.Cmplid where [email protected] and  
[email protected] 
end 
--End Compl Checking--- 
declare @locatnid integer, 
@location nvarchar(100) 
begin 
select @locatnid= t.Locid from dbo.Transaction_tbl t where [email protected] 
select l1.StartTime,l1.EndTime from dbo.Location_tbl l1 where [email protected] 
end 
end 
+0

出现错误:当子查询未与EXISTS一起引入时,只能在选择列表中指定一个表达式。 – user3252014 2014-09-30 07:32:38

+0

再试一次,因为我编辑了它 – 2014-09-30 07:33:27

+0

先生我编辑了我的问题。我期待这样的 – user3252014 2014-09-30 07:37:29

0

你有两个存储过程,主要目的是用一个存储过程。既然你已经写了两个。改变第二个程序添加@carid,添加另一个参数@option。如果您的选项为0,则执行第一个过程,否则执行第二个过程。

ALTER procedure [dbo].[Weekend] 
    @wday varchar(50), 
    @yr varchar(50), 
    @vtid integer, 
    @locid integer, 
    @option = 0, 
    @carid varchar(10) 
as 
begin 
set nocount on 
DECLARE @todaysdate date 
Declare @checkWeekend integer 
    select @todaysdate = CONVERT(varchar(10), GETDATE(), 111) 

select @checkWeekend= Weekend from weekends_tbl where [email protected] 
if @option = 1 
beging 
    exec [carcallD] @carid 
end 
else 
begin 
if @checkWeekend= 1 
begin 
    select Hamount as amount from locvtypeassign_tbl where 
    [email protected] and [email protected] and active=0 
end 
else 
begin 
if @todaysdate in(select Hdate from Pholidays_tbl where [email protected]) 
begin 
    select Hamount as amount from locvtypeassign_tbl where 
    [email protected] and [email protected] and active=0 
end 
else 
begin 
    select Namount as amount from locvtypeassign_tbl where 
    [email protected] and [email protected] and active=0 
end 
end 
end 
end 

你可以通过删除它来复制你的第一个过程,也可以在那里复制你的第一个过程。像

if @option = 1 
begin 
    select t.dtime,t.locid,t.vtid 
from Transaction_tbl t where [email protected] 
end 

哪里有你想要你的第一个程序被执行,然后设置通过@option为1到所有程序。或者让它假定默认的0值来执行sec过程。

+0

先生,我给我的预期出来..请你检查 – user3252014 2014-09-30 07:39:30

+0

哦,对不起,我明白了。在这种情况下,您可以使用临时表。执行第一个过程,然后将结果插入tempTable,然后将临时表加入到第二个过程中的select语句中。 btw什么列是常见的btw Transaction_tbl和你的locvtypeassign_tbl?我的意思是FK。有没有 ? – 2014-09-30 07:47:14