SQL почему не позволяют мне выбрать пустое значение и значение? - PullRequest
1 голос
/ 08 сентября 2010

У меня есть следующий 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 в моих sprocs:

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

Я использую этот оператор where в sprocs, который я использую для многозначных параметров служб отчетов. Когда пользователь выбирает просто пустое значение, он возвращает правильные данные, но если пользователь выбирает пустое значение и другое значение, имеющее текст, он больше не возвращает владельцев пустых значений, только владельцев из текста? Есть идеи? Я так понимаю, что-то не так с функцией?

1 Ответ

1 голос
/ 08 сентября 2010

Ну, из того, что я мог бы извлечь из ваших комментариев, кажется, что вам нужна новая функция расщепления.Вот что я использую:

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
  )

У него есть хорошая функция перечисления, и он не ест пробелов.:)

...