我有一个动态构建查询的存储过程。与此查询关联的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?
感谢您的帮助!
谢谢!
答案 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