存储过程从SQL Server中的存储过程本身获取值

时间:2014-09-30 07:24:41

标签: sql sql-server stored-procedures

我有两个存储过程。第一个存储过程值在第二个存储过程中使用。所以我想将两个存储过程合并为一个。

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

如果我使用carid 413 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 =

这里使用参数

  • @yr =我想从输出中传递特定的dtime日
  • @vtid =从我的输出中传递特定年份的dtime
  • @locid =从我的输出中传递vtid
  • dtime locid vtid amount ----------------------- ----------- ----------- --------- 2014-06-09 14:59:47 5 8 100 从我的输出传递locid

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

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

提前致谢

我想得到这样的输出:

{{1}}

3 个答案:

答案 0 :(得分:0)

您可以使用输出参数:

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

查看此链接:

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

答案 1 :(得分: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 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

答案 2 :(得分: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 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 

您也可以通过删除它来复制您的第一个程序并在那里复制exec。像

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

你希望你的第一个程序被执行,然后将@option作为1设置为所有程序。或者让它采用默认的0值来执行sec过程。