SQL为什么不让我选择空值和值?

时间:2010-09-08 15:31:12

标签: sql sql-server sql-server-2005 reporting-services visual-studio-2005

我有以下UDF。

CREATE FUNCTION [dbo].[udf_GenerateVarcharTableFromStringList]
        (@list      varchar(MAX),
         @delimiter char(1) = N',')
    RETURNS @tbl TABLE ([Value]     varchar(200)) 
    WITH SCHEMABINDING
    AS
    BEGIN
       DECLARE @chrind INT
       DECLARE @Piece nvarchar(4000)

       SELECT @chrind = 1
       WHILE @chrind > 0
          BEGIN
            SELECT @chrind = CHARINDEX(@delimiter,@list)
             IF @chrind > 0
                SELECT @Piece = LEFT(@list,@chrind - 1)
             ELSE
                SELECT @Piece = @list
             INSERT @tbl([Value]) VALUES(@Piece)
             SELECT @list = RIGHT(@list,LEN(@list) - @chrind)
             IF LEN(@list) = 0 BREAK
          END

       RETURN

    END

我使用以下代码示例从我的sprocs中的where子句调用此函数:

WHERE u.[Owner] IN 
 (SELECT [VALUE] 
  FROM dbo.udf_GenerateVarcharTableFromStringList(@Owners, ','))

我在sprocs中使用where where语句,用于报告服务多值参数。当用户只为该值选择空白时,它会返回正确的数据,但如果用户选择空白值而另一个实际具有文本的值,则不再返回空白值所有者,只是文本中的所有者?有任何想法吗?我认为这个功能有问题吗?

1 个答案:

答案 0 :(得分:1)

好吧,从你的评论中我可以收集到的,似乎你需要一个新的分裂功能。这是我使用的:

create FUNCTION [dbo].[fnSplitString] (@s varchar(512),@sep char(1))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn,
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
    FROM Pieces
  )

它有一个很好的枚举功能,它不会吃掉空白。 :)