2012-05-01 4 views
0

Я пытаюсь переписать хранимую процедуру, и мой SQL не очень хорош. То, что я надеюсь сделать, это написать так, чтобы, если ModuleID равен 555, выберите индивидуальный диапазон дат (например, 2012-01-01 2012-12-31). Текущий SP ниже.Сохраненная процедура с условным?

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 


/*** EventsGetByRange ***/ 

ALTER PROCEDURE [dbo].[EventsGetByRange] 
(
@Filter nvarchar(500), 
@BeginDate datetime, 
@EndDate datetime 
) 
AS 
SET DATEFORMAT mdy 
Declare @sql nvarchar(4000) 
Select @sql = 'SELECT E.PortalID, E.EventID, E.RecurMasterID, E.ModuleID, E.EventDateBegin, E.EventDateEnd, ' 
+ 'E.EventTimeBegin, E.Duration, E.EventName, E.EventDesc, ' 
+ 'E.Importance, E.CreatedDate, ' 
+ 'CreatedBy = U.DisplayName, ' 
+ 'CreatorID = E.CreatedBy, ' 
+ 'E.Every, ' 
+ 'E.Period, ' 
+ 'E.RepeatType, ' 
+ 'E.Notify, ' 
+ 'E.approved, ' 
+ 'E.Signups, ' 
+ 'E.MaxEnrollment, ' 
+ '(Select count(*) from dbo.EventsSignups WHERE EventID = E.EventID and E.Signups = 1) as Enrolled, ' 
+ 'E.EnrollRoleID, ' 
+ 'E.EnrollFee, ' 
+ 'E.EnrollType, ' 
+ 'E.PayPalAccount, ' 
+ 'E.PayPalPassword, ' 
+ 'E.Cancelled, ' 
+ 'E.DetailPage, ' 
+ 'E.DetailNewWin, ' 
+ 'E.DetailURL, ' 
+ 'E.ImageURL, ' 
+ 'E.ImageType, ' 
+ 'E.ImageWidth, ' 
+ 'E.ImageHeight, ' 
+ 'E.ImageDisplay, ' 
+ 'E.Location, ' 
+ 'c.LocationName, ' 
+ 'c.MapURL, ' 
+ 'E.Category, ' 
+ 'b.CategoryName, ' 
+ 'b.Color, ' 
+ 'b.FontColor, ' 
+ 'E.Reminder, ' 
+ 'E.TimezoneOffset, ' 
+ 'E.SendReminder, ' 
+ 'E.ReminderTime, ' 
+ 'E.ReminderTimeMeasurement, ' 
+ 'E.ReminderFrom, ' 
+ 'E.SearchSubmitted, ' 
+ 'E.CustomField1, ' 
+ 'E.CustomField2, ' 
+ 'E.EnrollListView, ' 
+ 'E.DisplayEndDate, ' 
+ 'E.AllDayEvent, ' 
+ 'E.OwnerID, ' 
+ 'OwnerName = O.DisplayName, ' 
+ 'E.LastUpdatedAt, ' 
+ 'LastUpdatedBy = L.DisplayName, ' 
+ 'E.LastUpdatedID, ' 
+ '(Select ModuleTitle from dbo.Modules WHERE ModuleID = E.ModuleID) as ModuleTitle, ' 
+ 'RMOwnerID = r.OwnerID, ' 
+ 'r.RRULE, ' 
+ 'E.OriginalDateBegin, ' 
+ 'E.NewEventEmailSent ' 
+ 'FROM dbo.Events E ' 
+ 'inner join dbo.EventsRecurMaster AS r on E.RecurMasterID = r.RecurMasterID ' 
+ 'left outer join dbo.Users U on E.CreatedBy = U.UserID ' 
+ 'left outer join dbo.Users O on E.OwnerID = O.UserID ' 
+ 'left outer join dbo.Users L on E.LastUpdatedID = L.UserID ' 
+ 'left join dbo.EventsCategory b on E.Category = b.Category ' 
+ 'left join dbo.EventsLocation c on E.Location = c.Location ' 
+ 'WHERE (E.ModuleID = 555 AND E.EventTimeBegin BETWEEN 2012-01-01 AND 2012-12-31) OR ((E.EventTimeBegin <= DATEADD(DAY,1,''' + convert(varchar, @EndDate) + ''') AND DATEADD(minute,E.Duration,E.EventTimeBegin) >= ''' + convert(varchar, @BeginDate) + ''') OR ' 
+ ' (E.EventTimeBegin BETWEEN ''' + convert(varchar, @BeginDate) + ''' AND DATEADD(DAY,1,''' + convert(varchar, @EndDate) + ''')))' 
+ ' AND E.Approved = 1' 
+ ' AND E.Cancelled = 0' 
+ ' ' + @Filter + ' ' 
+ ' ORDER BY E.EventDateBegin, E.EventTimeBegin, E.EventDateEnd' 
EXEC (@sql) 

UPDATE: Я использовал где statemnnt что Диего рекомендуется, но это не имея желаемого результата. Он не действует и If \ Else scanrio (что имеет смысл, когда я думаю об этом).

Мне нужно сначала определить, является ли идентификатор модуля 555, и если да, то только вытащите даты из жесткого кодированного диапазона, иначе выполните его как написано. Пожалуйста, дайте мне знать, если требуется более подробная информация.

+3

Почему вы используете динамический SQL вообще в вашем зр? Это пахнет уязвимостью sql-injection. –

+0

Я использую CMS и ограничусь тем, что могу и не могу редактировать. Это был обходной путь, который я придумал (теоретически) –

+0

Что не так? Какой размер @Filter? – Jones

ответ

1
  • это провал не работает?
  • Вы пытались добавить E.ModuleID = 555 в предложение where?
  • Вы действительно хотите скорректировать значение 555? как насчет передачи его по параметру?
  • И самый важный вопрос: зачем добавлять оператор sql в переменную и выполнять ее? почему бы просто не запустить SQL? Это из-за переменной @Filter?
  • также, sql server 2005 или 2008?
  • почему NVARCHAR и не VARCHAR на ваших переменных («п» занимает двойное пространства)

EDIT:

нормально, у вас есть или в там так что это может быть сложно. Вы хотите, чтобы все из кода 555, несмотря на значение диапазона дат, или все в пределах диапазона дат и кода 555? Я предполагаю, что вариант 2 будет иметь больше смысла, так что просто добавить

E.ModuleID = 555 

перед

+ ' AND E.Approved = 1' 
+0

Я не писал хранимую процедуру, которую я пытаюсь ее отредактировать. –

+0

Прок не терпит неудачу, я пытаюсь настроить его, чтобы придумать обходной путь. Sql server 2005, я хотел бы жестко закодировать переменную –

+0

ok, см. Мое редактирование – Diego

Смежные вопросы