0

以下のダイナミカクエリは機能しますが、以下のものが最適化できるかどうか、またはそれを行うためのより良い方法があるかどうか疑問に思っています。

ユーザーが場所と収集日を入力する Web フォームがあります。収集日については、From Date Collected と To Date Collected があります。ユーザーは、収集日を空白のままにします。この場合、収集日よりも後の処理が行われます。

以下の IS NOT NULL と 1=1 の実行方法に注意してください。また、動的 SQL が最善のアプローチなのか、それとももっと簡単な方法があるのか​​疑問に思っています。

    DECLARE @sql varchar(max);

    SET @sql = 'SELECT * from tblProgram WHERE 1=1' 

    IF (@Location IS NOT  NULL)
    BEGIN
      SET @sql = @sql + ' AND Location = ' +  @Location
    END      

    IF (@FromDateCollected IS NOT  NULL AND @ToDateCollected IS NOT NULL)
    BEGIN
         SET @sql = @sql + ' AND pw.DateCollected >= ' +  QUOTENAME(convert(varchar, @FromDateCollected,101),'''') 
         + ' AND pw.DateCollected <= ' + QUOTENAME(convert(varchar, @ToDateCollected,101),'''')

    END
    ELSE IF (@FromDateCollected IS NOT  NULL AND @ToDateCollected IS  NULL)
    BEGIN
      SET @sql = @sql + ' AND pw.DateCollected >= ' +  QUOTENAME(convert(varchar, @FromDateCollected,101),'''') 

    END 

   exec(@sql)
4

1 に答える 1

4

ta.speot.is コメントは静的 SQL を使用して行うことができます。

WHERE x is null or x > date_column? 

ただし、動的 ​​SQL の使用を主張する場合は、sp_executeSQLを使用してパラメーター化された SQL ステートメントを使用する必要があります。

読みやすく、quotename を使用する必要がなく、SQL インジェクションから保護されます

DECLARE @Location int 
DECLARE @FromDateCollected datetime 
DECLARE @ToDateCollected datetime
SET  @ToDateCollected  = '1/02/2012'



DECLARE @sql nvarchar(max)
DECLARE @ParmDefinition nvarchar(max)

SET  @ParmDefinition = N'@Location int , @FromDateCollected datetime, @ToDateCollected datetime ';

SET @sql = N'SELECT * from tblProgram WHERE 1=1' 

IF (@Location IS NOT  NULL)
BEGIN
   SET @sql = @sql + N' AND Location = @Location'
END      

IF (@FromDateCollected IS NOT  NULL AND @ToDateCollected IS NOT NULL)
BEGIN
   SET @sql = @sql + N' AND pw.DateCollected >= @FromDateCollected '
      + N' AND pw.DateCollected <= @ToDateCollected '

END
ELSE IF (@FromDateCollected IS NOT  NULL AND @ToDateCollected IS  NULL)
BEGIN
   SET @sql = @sql + N' AND pw.DateCollected >= @FromDateCollected' 

END 

exec sp_executesql @SQL, @ParmDefinition, @Location = @Location,
                                  @FromDateCollected = @FromDateCollected,
                                      @ToDateCollected = @ToDateCollected

デモ

于 2012-10-16T22:11:25.447 に答える