1

我有以下的UDF。SQL爲什麼不能讓我選擇一個空值和一個值?

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, ',')) 

我用這個地方的,我使用的報告服務,多值參數的存儲過程的語句。當用戶爲該值選擇空白時,它會返回正確的數據,但如果用戶選擇空白值和另一個實際上具有文本的值,則不會返回空白值的所有者,只是文本的所有者?有任何想法嗎?我認爲功能有問題嗎?

+2

一個簡單的拆分功能的好名字! – 2010-09-08 15:35:15

+0

'但如果用戶選擇一個空白值和另一個值actualyl有文本它不會返回空白值的所有者'我不明白。 – 2010-09-08 15:37:14

+0

在這兩種情況下,哪些作爲參數傳遞給函數? (使用SQL事件探查器查明你是否不知道)除非選擇了其他選項,否則RS默認會自動發送完整列表。 – 2010-09-08 15:37:53

回答

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 
) 

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

+0

也許我錯過了一些東西,不會停止總是大於零? – Thomas 2010-09-08 15:57:34

+0

無論如何,問題肯定與Reporting Services發送的內容有關。 OP使用多值參數,它必須默認發送所有值的完整逗號分隔列表,否則'in'將無法工作。 – 2010-09-08 16:02:08

+0

這很神奇!哈哈! :) – 2010-09-08 16:04:26

相關問題