2012-10-30 50 views
0

我最近发布了一个关于如何处理SQL Server Reporting Services中的NULL值的问题。问题位于Handle NULL values in SQL Server Reporting Services传递非空参数在SQL Server中返回NULL记录

应用WHERE @MyParam=MyCol OR @MyParam IS NULL会面临一个问题,即如果我选择单个非空值(从下拉列表中并将其作为SQL Server传递),这也会带来NULL值记录。它应该只带来Non NULL值的记录。

如果选择非空记录,应该如何避免空记录?

回答

0

你所寻找的是一个异或(XOR):

-- Exclusive OR is an either/or combination which, 
-- using => as "is defined as" symbol, can be shown as: 
-- 
-- x XOR y => (x AND (NOT y)) OR ((NOT x) AND y) 

-- x => @MyParam = MyCol 
-- y => @MyParam IS NULL 



-- DECLARE @MyParam NVARCHAR(32) = 'MC1,MC2'; -- returns two lines 
-- DECLARE @MyParam NVARCHAR(32) = 'MC1';  -- returns one line 
    DECLARE @MyParam NVARCHAR(32) = NULL;  -- returns one line 


DECLARE @MyParamXML XML = N'<root><r>' + replace(@MyParam,',','</r><r>') + '</r></root>' 

;WITH SOExample AS 
(
    SELECT cast('MC1' AS NVARCHAR(12)) AS MyCol, 'Line 1' AS MyCol2 UNION ALL 
    SELECT  'MC2'       , 'Line 2'    UNION ALL 
    SELECT  NULL       , 'Line NULL' 
) 
SELECT * from SOExample 
WHERE 
     (@MyParam IS NULL  AND ISNULL(MyCol,'<NULL Value>') = '<NULL Value>') 
    OR (@MyParam IS NOT NULL AND 
     SOExample.MyCol IN 
      (SELECT SSRSlist.MyParams.value('.','NVARCHAR(32)') as MyParam 
      FROM @MyParamXML.nodes('//root/r') as SSRSlist(MyParams))) 
+0

这正确把所有非NULL值,但选择空时,它不带NULL values.It在带来0行案件。 –

+0

我使用IN子句而不是'='使用MyCol时,因为值是多下拉列表 –

+0

感谢您的输入,但最终编辑也不会使用NULL值填充记录。它对NON-NULL记录非常有用。 –