SQL Server 2005 - 构建WHERE子句

时间:2010-06-06 18:24:12

标签: sql sql-server tsql

我有一个动态构建查询的存储过程。与此查询关联的where子句基于用户选择的过滤器值。无论我做什么,where子句似乎都没有设置。

-- Dynamically build the WHERE clause based on the filters
DECLARE @whereClause as nvarchar(1024)
IF (@hasSpouse > -1)
BEGIN
  IF (@hasSpouse = 0)
    SET @whereClause='p.[HasSpouse]=0'
  ELSE
    SET @whereClause='(p.[HasSpouse]=1 OR p.[HasSpouse] IS NULL)'
  END

  -- Dynamically add the next filter if necessary
  IF (@isVegan > -1)
  BEGIN
    IF (LEN(@whereClause) > 0)
    BEGIN
      SET @whereClause = @whereClause + ' AND '
    END

    IF (@isVegan = 0)
      SET @whereClause = @whereClause + 'c.[IsVegan]=0'
    ELSE
      SET @whereClause = @whereClause + '(c.[IsVegan]=1 OR c.[IsVegan] IS NULL)'
  END

  PRINT @whereClause

@whereClause从不打印任何东西。反过来,LEN(@whereClause)始终为NULL。 @isVegan和@hasSpouse值将传递到存储过程中。价值观是我的预期。

我做错了什么?为什么永远不会设置@whereClause?

感谢您的帮助!

谢谢!

4 个答案:

答案 0 :(得分:6)

首先初始化它,+ NULL始终为NULL

DECLARE @whereClause as nvarchar(1024)
SET @whereClause  = ''

答案 1 :(得分:2)

好吧,如果@Hasspouse不大于-1那么这些东西都不会被击中。此外,如果您没有将@whereClause设置为任何内容,则为null + text = null

我建议您检查@HasSpouse并在所有这些添加的顶部 SET @whereClause =''

答案 2 :(得分:2)

我用1=1初始化WHERE子句,所以之后的所有内容都与'AND'连接,并且它永远不会为NULL

DECLARE @whereClause as nvarchar(1024)
SET @whereClause = '1=1'

IF @hasSpouse > -1
BEGIN
  IF @hasSpouse = 0
    SET @whereClause = @whereClause + ' AND p.[HasSpouse]=0'
  ELSE
    SET @whereClause = @whereClause + ' AND (p.[HasSpouse]=1 OR p.[HasSpouse] IS NULL)'
END

-- Dynamically add the next filter if necessary
IF @isVegan > -1
BEGIN
    IF @isVegan = 0
      SET @whereClause = @whereClause + ' AND c.[IsVegan]=0'
    ELSE
      SET @whereClause = @whereClause + ' AND (c.[IsVegan]=1 OR c.[IsVegan] IS NULL)'
END

PRINT @whereClause

顺便说一句,SQL中不需要围绕条件的括号。它不是c#

答案 3 :(得分:0)

小心SQL注入

如果您没有使用sp_executesql参数的选项,请将其作为派生表 http://beyondrelational.com/blogs/madhivanan/archive/2010/05/14/derived-table-new-approach-to-avoid-sql-injection.aspx