Please start any new threads on our new site at https://forums.sqlteam.com. We've got lots of great SQL Server experts to answer whatever question you can come up with.

 All Forums
 SQL Server 2000 Forums
 Transact-SQL (2000)
 exec in store proc

Author  Topic 

gpiva
Starting Member

47 Posts

Posted - 2004-06-15 : 02:39:38
I have a store proc where I use exec but cannot run correctly
the code it seem correct ...
cannont understand any help will be appreciate...

CREATE PROCEDURE [spDoBooking]
@Tour_ID int,
@StartDate datetime
AS
BEGIN
DECLARE @Departure_Day datetime
DECLARE @Arrival_Day datetime
DECLARE @NewDepDateTime varchar(30)
DECLARE @NewArrDateTime varchar(30)
SET @Departure_Day=@StartDate
/*I select the row specified using coursor....*/
DECLARE @i int
SELECT @i = 1
DECLARE @DT_ID int
DECLARE @MT_ID int
DECLARE @Arrival_Location_ID int
DECLARE @Departure_Location_ID int
DECLARE @Departure_Time datetime
DECLARE @Arrival_Time datetime
DECLARE @NoOfDays int
DECLARE @NoOfDaysTrip int
-- 'INSENSITIVE' allows us to create a copy to work with and not the actual tables...
DECLARE cSnapBooking INSENSITIVE CURSOR
FOR
SELECT dbo.TOURS_DETAILS.DT_ID,
dbo.TOURS_MASTER.MT_ID,
dbo.TOURS_DETAILS.Arrival_Location_ID,
dbo.TOURS_DETAILS.Departure_Location_ID,
dbo.TOURS_DETAILS.Departure_Time,
dbo.TOURS_DETAILS.Arrival_Time,
dbo.TOURS_DETAILS.NoOfDays,
dbo.TOURS_DETAILS.NoOfDaysTrip
FROM dbo.TOURS_MASTER INNER JOIN
dbo.TOURS_DETAILS ON dbo.TOURS_MASTER.MT_ID = dbo.TOURS_DETAILS.MT_ID INNER JOIN
dbo.Locations ON dbo.TOURS_DETAILS.Departure_Location_ID = dbo.Locations.Location_ID INNER JOIN
dbo.Locations Locations_1 ON dbo.TOURS_DETAILS.Arrival_Location_ID = Locations_1.Location_ID
WHERE dbo.TOURS_MASTER.MT_ID = @Tour_ID
FOR READ ONLY
OPEN cSnapBooking
WHILE @i <= @@CURSOR_ROWS
BEGIN
FETCH cSnapBooking INTO @DT_ID,
@MT_ID,
@Arrival_Location_ID ,
@Departure_Location_ID ,
@Departure_Time ,
@Arrival_Time ,
@NoOfDays,
@NoOfDaysTrip
--Generate the real data booking based on the template....
SET @Arrival_Day=DATEADD(day, @NoOfDaysTrip, @Departure_Day)
--print @Departure_Day
--print @Arrival_Day

set @NewDepDateTime = ''''
set @NewDepDateTime = @NewDepDateTime + CONVERT(varchar(10), @Departure_Day , 101) + ' ' + CONVERT(varchar(8), @Departure_Time , 114)
set @NewDepDateTime = @NewDepDateTime + ''''

set @NewDepDateTime = ''''
set @NewArrDateTime = @NewArrDateTime + CONVERT(varchar(10), @Arrival_Day , 101) + ' ' + CONVERT(varchar(8), @Arrival_Time , 114)
set @NewArrDateTime = @NewArrDateTime + ''''
--print @NewDepDateTime
--print @NewArrDateTime

declare @varcharMT_ID varchar(12)
declare @varcharDeparture_Location_ID varchar(12)
declare @varcharArrival_Location_ID varchar(12)
set @varcharMT_ID = convert(varchar(10),@MT_ID)
print @varcharMT_ID
set @varcharDeparture_Location_ID = convert(varchar(10),@Departure_Location_ID)
set @varcharArrival_Location_ID = convert(varchar(10),@Arrival_Location_ID)
exec('INSERT INTO BOOKING_DETAILS (MT_ID,
Departure_Location_ID,
Arrival_Location_ID,
Departure_Time,
Arrival_Time,
NoOfDays)
VALUES(' +CONVERT(varchar(5), @MT_ID) + ','
+CONVERT(varchar(5), @Departure_Location_ID)+ ','
+CONVERT(varchar(5), @Arrival_Location_ID) + ','
+@NewDepDateTime+','
+@NewArrDateTime+',0)')

--EXEC(@StrSql)
--SET @Departure_Day = DATEADD(day, @NoOfDays, @Arrival_Day)
SELECT @i = @i + 1 --increment counter
END
CLOSE cSnapBooking
DEALLOCATE cSnapBooking
END
GO

gpiva
Starting Member

47 Posts

Posted - 2004-06-15 : 03:47:04
I've done without exec ... thank you anyway...


quote:
Originally posted by gpiva

I have a store proc where I use exec but cannot run correctly
the code it seem correct ...
cannont understand any help will be appreciate...

CREATE PROCEDURE [spDoBooking]
@Tour_ID int,
@StartDate datetime
AS
BEGIN
DECLARE @Departure_Day datetime
DECLARE @Arrival_Day datetime
DECLARE @NewDepDateTime varchar(30)
DECLARE @NewArrDateTime varchar(30)
SET @Departure_Day=@StartDate
/*I select the row specified using coursor....*/
DECLARE @i int
SELECT @i = 1
DECLARE @DT_ID int
DECLARE @MT_ID int
DECLARE @Arrival_Location_ID int
DECLARE @Departure_Location_ID int
DECLARE @Departure_Time datetime
DECLARE @Arrival_Time datetime
DECLARE @NoOfDays int
DECLARE @NoOfDaysTrip int
-- 'INSENSITIVE' allows us to create a copy to work with and not the actual tables...
DECLARE cSnapBooking INSENSITIVE CURSOR
FOR
SELECT dbo.TOURS_DETAILS.DT_ID,
dbo.TOURS_MASTER.MT_ID,
dbo.TOURS_DETAILS.Arrival_Location_ID,
dbo.TOURS_DETAILS.Departure_Location_ID,
dbo.TOURS_DETAILS.Departure_Time,
dbo.TOURS_DETAILS.Arrival_Time,
dbo.TOURS_DETAILS.NoOfDays,
dbo.TOURS_DETAILS.NoOfDaysTrip
FROM dbo.TOURS_MASTER INNER JOIN
dbo.TOURS_DETAILS ON dbo.TOURS_MASTER.MT_ID = dbo.TOURS_DETAILS.MT_ID INNER JOIN
dbo.Locations ON dbo.TOURS_DETAILS.Departure_Location_ID = dbo.Locations.Location_ID INNER JOIN
dbo.Locations Locations_1 ON dbo.TOURS_DETAILS.Arrival_Location_ID = Locations_1.Location_ID
WHERE dbo.TOURS_MASTER.MT_ID = @Tour_ID
FOR READ ONLY
OPEN cSnapBooking
WHILE @i <= @@CURSOR_ROWS
BEGIN
FETCH cSnapBooking INTO @DT_ID,
@MT_ID,
@Arrival_Location_ID ,
@Departure_Location_ID ,
@Departure_Time ,
@Arrival_Time ,
@NoOfDays,
@NoOfDaysTrip
--Generate the real data booking based on the template....
SET @Arrival_Day=DATEADD(day, @NoOfDaysTrip, @Departure_Day)
--print @Departure_Day
--print @Arrival_Day

set @NewDepDateTime = ''''
set @NewDepDateTime = @NewDepDateTime + CONVERT(varchar(10), @Departure_Day , 101) + ' ' + CONVERT(varchar(8), @Departure_Time , 114)
set @NewDepDateTime = @NewDepDateTime + ''''

set @NewDepDateTime = ''''
set @NewArrDateTime = @NewArrDateTime + CONVERT(varchar(10), @Arrival_Day , 101) + ' ' + CONVERT(varchar(8), @Arrival_Time , 114)
set @NewArrDateTime = @NewArrDateTime + ''''
--print @NewDepDateTime
--print @NewArrDateTime

declare @varcharMT_ID varchar(12)
declare @varcharDeparture_Location_ID varchar(12)
declare @varcharArrival_Location_ID varchar(12)
set @varcharMT_ID = convert(varchar(10),@MT_ID)
print @varcharMT_ID
set @varcharDeparture_Location_ID = convert(varchar(10),@Departure_Location_ID)
set @varcharArrival_Location_ID = convert(varchar(10),@Arrival_Location_ID)
exec('INSERT INTO BOOKING_DETAILS (MT_ID,
Departure_Location_ID,
Arrival_Location_ID,
Departure_Time,
Arrival_Time,
NoOfDays)
VALUES(' +CONVERT(varchar(5), @MT_ID) + ','
+CONVERT(varchar(5), @Departure_Location_ID)+ ','
+CONVERT(varchar(5), @Arrival_Location_ID) + ','
+@NewDepDateTime+','
+@NewArrDateTime+',0)')

--EXEC(@StrSql)
--SET @Departure_Day = DATEADD(day, @NoOfDays, @Arrival_Day)
SELECT @i = @i + 1 --increment counter
END
CLOSE cSnapBooking
DEALLOCATE cSnapBooking
END
GO

Go to Top of Page

Kristen
Test

22859 Posts

Posted - 2004-06-15 : 04:22:56
Much better without EXEC, but if you do need it there are two issues in your code:

1. You can't have an expression in EXEC() - so you need to store in temporary variable first

2. The STRING variables need to be surrounded by single quotes (and you would need to watch out in case anything was NULL because concatenating the string will cause the whole thing to become NULL if any single @variable is NULL)

Something like this:

SELECT @strSQL = 'INSERT INTO BOOKING_DETAILS (MT_ID,
Departure_Location_ID,
Arrival_Location_ID,
Departure_Time,
Arrival_Time,
NoOfDays)
VALUES(' +CONVERT(varchar(5), @MT_ID) + ','
+CONVERT(varchar(5), @Departure_Location_ID)+ ','
+CONVERT(varchar(5), @Arrival_Location_ID) + ','
+''''+@NewDepDateTime+''''+','
+''''+@NewArrDateTime+''''+',0)'

EXEC (@strSQL)
to take care of NULLs you would need to substitute something like:
+ COALESCE(''''+@NewArrDateTime+'''', 'NULL') +

Kristen
Go to Top of Page

Kristen
Test

22859 Posts

Posted - 2004-06-15 : 04:38:06
OK, I now see you had single quotes in your string handling anyway, sorry about that.

By the by, this will run like a dog with the cursor.

Can't you just do:

CREATE PROCEDURE dbo.spDoBooking
@Tour_ID int,
@StartDate datetime
AS
BEGIN
INSERT INTO BOOKING_DETAILS
(
MT_ID,
Departure_Location_ID,
Arrival_Location_ID,
Departure_Time,
Arrival_Time,
NoOfDays
)
SELECT dbo.TOURS_MASTER.MT_ID,
dbo.TOURS_DETAILS.Departure_Location_ID,
dbo.TOURS_DETAILS.Arrival_Location_ID,
CONVERT(varchar(10), @StartDate , 101)
+ ' ' + CONVERT(varchar(8), Departure_Time , 114),
CONVERT(varchar(10), DATEADD(day, NoOfDaysTrip, @StartDate) , 101)
+ ' ' + CONVERT(varchar(8), Arrival_Time , 114),
0
FROM dbo.TOURS_MASTER
JOIN dbo.TOURS_DETAILS
ON dbo.TOURS_MASTER.MT_ID = dbo.TOURS_DETAILS.MT_ID
JOIN dbo.Locations
ON dbo.TOURS_DETAILS.Departure_Location_ID = dbo.Locations.Location_ID
JOIN dbo.Locations Locations_1
ON dbo.TOURS_DETAILS.Arrival_Location_ID = Locations_1.Location_ID
WHERE dbo.TOURS_MASTER.MT_ID = @Tour_ID
END

Kristen
Go to Top of Page
   

- Advertisement -