2012-05-10 6 views
1

以下のストアドプロシージャは、日付チェックの2番目の部分のコメントを 'where'節でコメント解除すると、日付変換で爆発する渡されたキーワードがNULLまたは '111'であってもT-SQL 'AND'キーワードが短絡していないと思われます

私は、この動的where節のやり方の提案については何も言及していません。

何か助けていただきありがとうございます。

この男のブログに基づき
ALTER PROCEDURE [SurveyEngine].[GetPageOf_CommentsOverviewRowModel] 
     @sortColumn varchar(50), 
     @isASC bit, 
     @keyword varchar(50) 
    AS 
    BEGIN 

     declare @keywordType varchar(4) 
     set @keywordType = null 

     if ISDATE(@keyword) = 1 
      set @keywordType = 'date' 
     else if ISNUMERIC(@keyword) = 1 
      set @keywordType = 'int' 

     select  c.CommentBatch BatchID, c.CreatedDate DateReturned, COUNT(c.CommentID) TotalComments 
     from  SurveyEngine.Comment c 
     where  (@keywordType is null) 
     or   (@keywordType = 'date') --and c.CreatedDate = @keyword) 
     or   (@keywordType = 'int' and (CONVERT(varchar(10), c.CommentBatch) like @keyword+'%')) 

     group by c.CommentBatch, c.CreatedDate 
     order by case when @sortColumn = 'BatchID' and @isASC = 0 then c.CommentBatch end desc, 
        case when @sortColumn = 'BatchID' and @isASC = 1 then c.CommentBatch end, 
        case when @sortColumn = 'DateReturned' and @isASC = 0 then c.CreatedDate end desc, 
        case when @sortColumn = 'DateReturned' and @isASC = 1 then c.CreatedDate end, 
        case when @sortColumn = 'TotalComments' and @isASC = 0 then COUNT(c.CommentID) end desc, 
        case when @sortColumn = 'TotalComments' and @isASC = 1 then COUNT(c.CommentID) end 
    END 
+0

興味があるかもしれません:http://stackoverflow.com/questions/206484/sql-switch-case-in-where-clause –

+0

私は投稿前に確認しましたが、実際の問題は 'and'演算子が@keywordTypeが 'date'でないときに第2文が評価されないようにしてください。信じられないほど明白なものがなければならないが、私はそれを見ていない。 –

+0

c.CraetedDateが日付であると仮定するか、または(@keywordType = 'date'とc.CreatedDate = Convert(DateTime、@ keyword))? –

答えて

2

EDIT申し訳ありませんが、脳雲です。物事を別々に初期化する必要があります。

変更にセットアップ:次に

declare @keywordType varchar(4) 
    declare @TargetDate as DateTime = NULL 

    set @keywordType = null 

    if ISDATE(@keyword) = 1 
     begin 
     set @keywordType = 'date' 
     set @TargetDate = Cast(@keyword as DateTime) 
     end 
    else if ISNUMERIC(@keyword) = 1 
     set @keywordType = 'int' 

は変更:

and c.CreatedDate = @keyword 

に:あなたは日付で検索されていない場合はNOPになります

and c.CreatedDate = Coalesce(@TargetDate, c.CreatedDate) 

+0

これは私の仕事で働いて、私のプロジェクトを進めることができました。また、Coalesceについて学ぶこともできます。これは非常に便利です。 –

2

http://blogs.msdn.com/b/bartd/archive/2011/03/03/don-t-depend-on-expression-short-circuiting-in-t-sql-not-even-with-case.aspxあなたは短絡がサポートされているにもかかわらず、WHERE句での操作の順序を保証することはできませんように見えます。実行計画は、第2の文を最初に評価することを選択することができる。

彼は、「より多くの」ものとして、代わりに(前述のpstのような)ケース構造を使用することをお勧めします。しかし、私は3つの異なる演算子(nu​​ll、=、LIKE)を使用しているため、where節をケースとして書き換えることはできないと思います。

関連する問題