2012-05-01 5 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) 

업데이트 :이 곳은 디에고 권장하지만 원하는 결과를 가지고 있지 않은지 statemnnt 사용. scanrio로 작동하지 않습니다. (생각할 때 말이됩니다.)

먼저 모듈 ID가 555인지 확인하고 하드 코드 된 범위에서 날짜를 가져오고 그렇지 않으면 쓰여진대로 실행해야합니다. 자세한 내용이 필요한 경우 알려 주시기 바랍니다.

+3

전에

E.ModuleID = 555 

를 추가 할 것 같은데요? SQL 주입 취약점이 있습니다. –

+0

CMS를 사용하고 있으며 편집 할 수있는 기능에 제한되어 있습니다. 이것이 내가 (이론상으로) 생각해 낸 해결 방법이었습니다 –

+0

무엇이 잘못 되었나요? @Filter의 크기는 어느 정도입니까? – Jones

답변

1
  • proc가 실패 했습니까?
  • E.ModuleID = 555를 where 절에 추가하려고 시도 했습니까?
  • 정말로 555 값을 하드 코딩 하시겠습니까? 매개 변수에 을 전달하는 방법은 무엇입니까?
  • 그리고 가장 중요한 질문은 : 왜 변수에 sql 문을 추가하고 실행해야합니까? SQL을 실행하지 않는 이유는 무엇입니까? @Filter 변수가 일까요?
  • 또한 SQL Server 2005 또는 2008? 당신의 변수에 대한 NVARCHAR하지 VARCHAR는

("n"은 이중 공간 차지) 왜

  • 는 편집 :이 까다로운 일이 될 수 있도록

    좋아, 거기에 OR있다. 날짜 범위 값이나 날짜 범위 및 코드 555의 모든 항목에도 불구하고 코드 555의 모든 것을 원하십니까? 나는 왜 당신이 당신의 SP에 모든 동적 SQL을 사용하는 더 나을 옵션 2가, 그래서 그냥

    + ' AND E.Approved = 1' 
    
  • +0

    편집하려고하는 저장 프로 시저를 작성하지 않았습니다. –

    +0

    proc가 실패하지 않고 해결 방법을 찾기 위해 사용자 지정하려고합니다. SQL 서버 2005, 변수를 하드 코드하고 싶습니다. –

    +0

    내 편집을 참조하십시오. – Diego