【问题标题】:SQL Server split string built in function vs old-style TVF for splitting string with SSRSSQL Server 内置函数拆分字符串与使用 SSRS 拆分字符串的旧式 TVF
【发布时间】:2020-12-14 19:07:53
【问题描述】:

我有以下 Split 函数,它现在与用于 SSRS 报告的多值参数一起使用了一段时间。

CREATE FUNCTION [dbo].[FnSplit]
     (@List NVARCHAR(MAX),
      @SplitOn NVARCHAR(5))  
RETURNS @RtnValue TABLE 
                  (
                       Id INT IDENTITY(1,1),
                       Value NVARCHAR(100)
                  ) 
AS  
BEGIN
    WHILE (CHARINDEX(@SplitOn, @List) > 0)
    BEGIN 
        INSERT INTO @RtnValue (value)
            SELECT
                Value = LTRIM(RTRIM(SUBSTRING(@List, 1, CHARINDEX(@SplitOn, @List) - 1))) 
        SET @List = SUBSTRING(@List, CHARINDEX(@SplitOn, @List) + LEN(@SplitOn), LEN(@List))
    END 

    INSERT INTO @RtnValue (Value)
        SELECT Value = LTRIM(RTRIM(@List))

    RETURN
END

这种方法有点麻烦,但我注意到,由于我们升级了我们的 SQL Server 版本,现在它支持String_Split,这是一个内置函数。

我的问题是任何使用过这个的知情人士:这可以用来完全替代上面显示的多值参数函数吗?

提前谢谢你

【问题讨论】:

  • String_Split() 有一个缺点......它不 gtd 序列。此外,应尽可能避免循环。
  • 您好,谢谢,有没有比我上面使用的更好的方法以及避免循环的方法?我想从最终用户的角度来看,如果它都是按字母顺序排列的,那么排序很重要。有没有办法按顺序使用 String_Split() 并以某种方式对其进行排序?
  • 见下面的例子

标签: sql sql-server reporting-services


【解决方案1】:

如果 2016+,我喜欢 JSON 方法。如果不是 2016+ ... 还有一种 XML 方法。

示例

Select * from [dbo].[tvf-Str-Parse-JSON]('Dog,Cat,House,Car',',')

退货

RetSeq  RetVal
1       Dog
2       Cat
3       House
4       Car

有兴趣的 TVF

CREATE FUNCTION [dbo].[tvf-Str-Parse-JSON] (@String varchar(max),@Delimiter varchar(10))
Returns Table 
As
Return (  
    Select RetSeq = [Key]+1
          ,RetVal = Value
     From  OpenJSON( '["'+replace(replace(@String,'"','\"'),@Delimiter,'","')+'"]' )
);

【讨论】:

  • 谢谢你,约翰,我需要玩弄你发送的内容,从未在 SQL 中使用过 JSON,所以应该很有趣。那么我是否正确猜测我仍然需要使用 TVF,特别是如果我想在参数中订购列表?没有单独使用 String_Split 的 TFV 就没有办法吗?您上面的解决方案看起来不错,因为它使用循环:)
  • @abs786123 string_split() 是一个 TVF。如果您不关心序列,那么 string_split() 是要走的路。
【解决方案2】:

简单但应该做的工作

DECLARE @list varchar(max) = 'john, bob, dave'

SELECT txt
    FROM (SELECT ltrim(rtrim([Value])) as txt from string_split(@list, ',')) s 
    ORDER BY txt

返回

【讨论】:

  • 非常感谢你们,我现在有点偏离主要问题,但是如果有一个单引号说像 O'Hare 这样的名字,这可以用来照顾因为名字总是被添加,我不会更聪明?谢谢
  • 这必须由构建分隔字符串的任何东西来处理。您可以使用管道 | 进行分隔,因为它也不太可能使用,但仍然需要解决单引号/撇号问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多