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.
| 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 correctlythe 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 ENDGO |
|
|
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 correctlythe 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 ENDGO
|
 |
|
|
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 first2. 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 |
 |
|
|
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 ASBEGININSERT 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), 0FROM 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_IDWHERE dbo.TOURS_MASTER.MT_ID = @Tour_IDEND Kristen |
 |
|
|
|
|
|
|
|