【问题标题】:SQL why wont this let me select a blank value and a value?SQL为什么不能让我选择一个空白值和一个值?
【发布时间】:2010-09-08 15:31:11
【问题描述】:

我有以下 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

我在存储过程中的 where 子句中使用以下代码示例调用此函数:

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

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

【问题讨论】:

  • 一个简单的分割函数真是个好名字!
  • but if a user selects a blank value and another value that actualyl has text it does not return the blank value owners anymore 我不明白。
  • 在这两种情况下,什么作为参数传递给函数? (如果您不知道,请使用 SQL Profiler 查找)也许 RS 会默认自动发送完整列表,除非选择了另一个选项。
  • 我不知道如何使用 sql profiler,但例如所有者可能是 15103N,它只给我正确的单元 e1601,如果我只为所有者选择空白,它给我 e1502 这是正确的但是当我为所有者选择空白和 15103N 时,它只给我 e1601 .....
  • 哇哈哈。糟糕...尝试将以下内容传递给 TVF:'15103n,,'

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


【解决方案1】:

好吧,根据我从您的 cmets 收集到的信息,您似乎需要一个新的拆分功能。这是我使用的:

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
  )

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

【讨论】:

  • 也许我遗漏了什么,stop 不会总是大于零吗?
  • 当然问题出在 Reporting Services 发送的内容上。 OP 正在使用多值参数,它必须默认发送所有值的完整逗号分隔列表,否则 in 将永远无法工作。
  • 如何调用这个函数?和我在 sproc 中的一样吗?
  • @Martin 好吧,所有者要么拥有完整的值,要么拥有降级的“空字符串”,如果您传递 CSV ('o1,'),您将选择与o1 或 ''(非 NULL)。
  • 但是,通过为其分配一个空字符串值来指定缺少的所有者通常是一个坏主意。
猜你喜欢
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 2023-01-24
  • 2019-03-20
  • 1970-01-01
相关资源
最近更新 更多