使用between将范围分配给变量

时间:2013-06-17 07:58:41

标签: tsql

我有以下的decitiontree:

declare @placeholder varchar(20)

If @Number1 = 1
AND @Number2 = 0
BEGIN SET @placeholder = 'NULL'
END
ELSE IF @Number1 = 1
AND @Number2 > 0
BEGIN SET @placeholder = Between (@Number2*10) AND (@Number2*10+9)
END 
ELSE
BEGIN
SET @placeholder = @Othervariable
END

我需要查询的变量:

SELECT * FROM Table
WHERE @Placeholder is null or ID = @placeholder.

但是'Between'部分不起作用。任何人都可以帮我吗?

1 个答案:

答案 0 :(得分:1)

这在SQL服务器中不起作用 - 没有包含lambda表达式的变量类型,比如Between (@Number2*10) AND (@Number2*10+9)

一种方法是将其存储在字符串中(例如,nvarchar(max))并使用exec()或sp_executesql()执行。

另一种(通常是更优化的)方式是形成主表达式以包括子表达式以及排除标准。

以下是一个例子:

DECLARE @Number1 int = 1 -- input variable 1
DECLARE @Number2 int = 1 -- input variable 2
DECLARE @excl1 bit = 0 -- exclusion criteria 1 (ec1)
DECLARE @excl2 bit = 0 -- exclusion criteria 2 (ec2)

-- fill excl. crit.
SET @excl1 = CASE WHEN @Number1 = 1 AND @Number2 = 0 THEN 1 ELSE 0 END
SET @excl2 = CASE WHEN @Number1 = 1 AND @Number2 > 0 THEN 1 ELSE 0 END

-- just output to see what's happening
PRINT @Number1
PRINT @Number2
PRINT @excl1
PRINT @excl2

SELECT * 
FROM Table
WHERE 
  -- if ec1 is active, we apply sub-expression 1
  (@excl1 = 0 OR 
    (@excl1 = 1 AND ID IS NULL))
  AND 
  -- if ec2 is active, we apply sub-expression 2
  (@excl2 = 0 OR 
    (@excl2 = 1 AND ID BETWEEN @Number2 * 10 AND @Number2 * 10 + 9))