Хранимая процедура берет значение из самой хранимой процедуры в SQL Server

106
13

У меня есть две хранимые процедуры. Первое значение хранимой процедуры, используемое во второй хранимой процедуре. Поэтому я хочу объединить две хранимые процедуры в одну.

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

Если я carid это с carid 413 я carid вот так:

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 = передать объект из моего вывода

Могу ли я объединить эти две хранимые процедуры в одну?

Если кто-нибудь сможет мне помочь, я буду признателен.

заранее спасибо

Я хочу получить результат следующим образом:

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

спросил(а) 2021-01-19T15:27:14+03:00 2 месяца, 3 недели назад
1
Решение
97

Попробуй это

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

ответил(а) 2021-01-19T15:27:14+03:00 2 месяца, 3 недели назад
44

Вы можете использовать выходные параметры:

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

ответил(а) 2021-01-19T15:27:14+03:00 2 месяца, 3 недели назад
44

У вас есть две хранимые процедуры, основная цель - использовать одну хранимую процедуру. Так как у вас уже два написанных. Измените вторую процедуру, добавьте @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

Вы также можете скопировать свою первую процедуру и проделать вместо нее место, исключив ее. как


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

где когда-либо вы хотите, чтобы ваша первая процедура выполнялась, установите pass @option как 1 для процедуры, которую все. ИЛИ оставьте это, чтобы принять значение по умолчанию 0 для выполнения процедуры sec.

ответил(а) 2021-01-19T15:27:14+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема