简体   繁体   中英

Stored procedure take value from stored procedure itself in SQL Server

I have two stored procedures. The first stored procedure value's using in second stored procedure. So I want to combine the two stored procedures into a single one.

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

If I execute this with carid of 413 I will get out put like this:

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

My other stored procedure looks like this:

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

Here am using parameter

  • @wday = I want to pass particular day of dtime from my output
  • @yr = pass particular year of dtime from my output
  • @vtid = pass vtid from my output
  • @locid = pass locid from my output

So can I combine these two stored procedures into a single one?

If anyone is able to help me, I'd appreciate it.

Thanks in advance

I want to get output like this:

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

You can use output parameteres:

CREATE PROCEDURE GetImmediateManager
    @employeeID INT,
    @managerID INT OUTPUT
AS
BEGIN
   SELECT @managerID = ManagerID 
  FROM HumanResources.Employee 
  WHERE EmployeeID = @employeeID
END

Get a look in this link:

http://technet.microsoft.com/en-us/library/ms378108(v=sql.110).aspx

Try this

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 Tbarcode=@carid 
set @day=datename(Weekday,@wday) 
set @year=year(@wday) 
set @vtid = (select t.vtid 
from Transaction_tbl t where Tbarcode=@carid); 
set @locid = (select t.locid 
from Transaction_tbl t where Tbarcode=@carid); 
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 weekdays=@day 
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 loc.vtid=@vtid and loc.locid=@locid and loc.active=0 and t.TBarcode=@carid 
end 
else 
--Check current day belongs to any public holiday 
begin 
if @todaysdate in(select Hdate from Pholidays_tbl where year=@year) 
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 loc.vtid=@vtid and loc.locid=@locid and loc.active=0 and t.TBarcode=@carid 
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 loc.vtid=@vtid and loc.locid=@locid and loc.active=0 and t.TBarcode=@carid 
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 T1.TBarcode=@Carid)=1 
begin 
declare @compl integer =null, 
@transid integer=null, 
@complid integer=null 
select @transid=t.transactID from dbo.Transaction_tbl t where t.TBarcode=@carid 
Select @compl=co.Cmplid from dbo.ComplimentTransactAssign_tbl co where co.TransactID=@transid 
select c.CompName,c1.Remarks from Complimentary_tbl c 
inner join ComplimentTransactAssign_tbl c1 on c.CmplID=c1.Cmplid where c.CmplID=@compl and      
c1.TransactID=@transid 
end 
--End Compl Checking--- 
declare @locatnid integer, 
@location nvarchar(100) 
begin 
select @locatnid= t.Locid from dbo.Transaction_tbl t where t.TBarcode=@carid 
select l1.StartTime,l1.EndTime from dbo.Location_tbl l1 where l1.Locid=@locatnid 
end 
end

You have two stored procedures, the main aim is to use one stored procedure. Since you have two written already. Alter the second procedure add the @carid , add another parameter @option . If your option is 0 then execute the first procedure, else execute the second.

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 weekdays=@wday
if @option = 1
beging
   exec [carcallD] @carid
end
else
begin
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
end 

You can copy your first procedure also and past in the place of exec there by eliminating it. like

if @option = 1 
begin
  select t.dtime,t.locid,t.vtid 
 from Transaction_tbl t where Tbarcode=@carid
end

where ever you want your first procedure to be executed, then set pass @option as 1 to the procedure that's all. OR leave it to assume the default 0 value to execute the sec procedure.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM