sql-server-2008 - SQL Server : Split operation

标签 sql-server-2008 split

如何在 SQL Server 中拆分字符串。

示例:

输入字符串:堆栈溢出

结果:

stack
over
flow

最佳答案

如果无法使用表值参数,请参阅:"Arrays and Lists in SQL Server 2008 Using Table-Valued Parameters" by Erland Sommarskog ,那么SQL Server中有很多种分割字符串的方法。本文涵盖了几乎每种方法的优点和缺点:

"Arrays and Lists in SQL Server 2005 and Beyond, When Table Value Parameters Do Not Cut it" by Erland Sommarskog

您需要创建一个分割函数。这是 split 函数的使用方式:

SELECT
    *
    FROM YourTable                               y
    INNER JOIN dbo.yourSplitFunction(@Parameter) s ON y.ID=s.Value

I prefer the number table approach to split a string in TSQL但是 SQL Server 中有多种分割字符串的方法,请参阅前面的链接,其中解释了每种方法的优点和缺点。

要使数字表方法发挥作用,您需要执行一次时间表设置,这将创建一个包含从 1 到 10,000 行的数字表:

SELECT TOP 10000 IDENTITY(int,1,1) AS Number
    INTO Numbers
    FROM sys.objects s1
    CROSS JOIN sys.objects s2
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)

设置 Numbers 表后,创建此拆分函数:

CREATE FUNCTION [dbo].[FN_ListToTable]
(
     @SplitOn  char(1)      --REQUIRED, the character to split the @List string on
    ,@List     varchar(8000)--REQUIRED, the list to split apart
)
RETURNS TABLE
AS
RETURN 
(

    ----------------
    --SINGLE QUERY-- --this will not return empty rows
    ----------------
    SELECT
        ListValue
        FROM (SELECT
                  LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue
                  FROM (
                           SELECT @SplitOn + @List + @SplitOn AS List2
                       ) AS dt
                      INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
                  WHERE SUBSTRING(List2, number, 1) = @SplitOn
             ) dt2
        WHERE ListValue IS NOT NULL AND ListValue!=''

);
GO 

您现在可以轻松地将 CSV 字符串拆分到表中并加入其中:

select * from dbo.FN_ListToTable(' ','stack over flow')

输出:

ListValue
-------------------
stack
over
flow

(3 row(s) affected)

关于sql-server-2008 - SQL Server : Split operation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2507330/

相关文章:

sql - 使用 SQL Server 将列转置为行

asp.net - 如何按字母顺序显示 row_number

c# - 解析具有多个值行的文件 C#

java - 在 Java 中将单词拆分为字母

python - 如何在 Python 中拆分 1 次或多次出现的分隔符?

sql-server-2008 - 链接服务器 "Microsoft.ACE.OLEDB.12.0"的 OLE DB 提供程序 "(null)"返回消息 "Bookmark is invalid."

sql-server-2008 - 从插入语句中的子查询(超过 1 条记录)获取最新日期

sql-server - 在 0-30 范围内设置一个值

java - 为什么我的 split 太过雄心勃勃?

数据框中的 R strsplit 函数