SQL Server 2005 - Построение предложения WHERE - PullRequest
1 голос
/ 06 июня 2010

У меня есть хранимая процедура, которая динамически создает запрос.Предложение 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 ]

6 голосов
/ 06 июня 2010

Сначала инициализируйте его, что-то + NULL всегда NULL

DECLARE @whereClause as nvarchar(1024)
SET @whereClause  = ''
2 голосов
/ 06 июня 2010

Я бы инициализировал предложение WHERE с 1=1, поэтому все, что после этого - это конкатенация с 'И', и оно никогда не будет равно 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. Это не с #

2 голосов
/ 06 июня 2010

Ну, если @Hasspouse не больше -1, то ничего из этого не получится.Кроме того, если для @whereClause ничего не установлено, тогда null + text = null

Я рекомендую вам проверить @HasSpouse и в начале всего этого добавить SET @whereClause = ''

0 голосов
/ 07 июня 2010

Остерегайтесь SQL-инъекций

Если у вас нет возможности использовать параметры с sp_executesql, сделайте его производной таблицей http://beyondrelational.com/blogs/madhivanan/archive/2010/05/14/derived-table-new-approach-to-avoid-sql-injection.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...