Sql server 在sql server中将字符串拆分为行

Sql server 在sql server中将字符串拆分为行,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我在sql ABCDEF中有一个字符串。这在EMP表的First_Name列下。 我想把这个字符串分成以下几行 请注意,没有分隔符、逗号或空格。它是一个没有任何特殊字符、特殊符号和空格的字符串 First_Name A B C D E F 显然,我想到了一个循环,但我们可以做得更好。这就是理货或数字表的完美之处。我的系统中有这样一个视图,它创建这样一个表,需要时有10000行。有很多方法可以创建这样的表,或者您可以创建一个持久表来略微提高性能 create View [dbo].[cteTal

我在sql ABCDEF中有一个字符串。这在EMP表的First_Name列下。 我想把这个字符串分成以下几行

请注意,没有分隔符、逗号或空格。它是一个没有任何特殊字符、特殊符号和空格的字符串

First_Name
A
B
C
D
E
F

显然,我想到了一个循环,但我们可以做得更好。这就是理货或数字表的完美之处。我的系统中有这样一个视图,它创建这样一个表,需要时有10000行。有很多方法可以创建这样的表,或者您可以创建一个持久表来略微提高性能

create View [dbo].[cteTally] as

WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
    )
select N from cteTally
现在我们有了这样的观点,使用完全基于集合的方法,放弃循环的想法,这种事情是超级无痛的

declare @Something varchar(20) = 'ABCDEF'

select SUBSTRING(@Something, N, 1)
from cteTally t
where t.N < LEN(@Something)

显然,我想到了一个循环,但我们可以做得更好。这就是理货或数字表的完美之处。我的系统中有这样一个视图,它创建这样一个表,需要时有10000行。有很多方法可以创建这样的表,或者您可以创建一个持久表来略微提高性能

create View [dbo].[cteTally] as

WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
    )
select N from cteTally
现在我们有了这样的观点,使用完全基于集合的方法,放弃循环的想法,这种事情是超级无痛的

declare @Something varchar(20) = 'ABCDEF'

select SUBSTRING(@Something, N, 1)
from cteTally t
where t.N < LEN(@Something)

如果您有一个表,那么解决这个问题很简单。不需要循环或游标,因此性能比其他解决方案好几个数量级:

declare @name varchar(10)='ABCDEF'

select @name,SUBSTRING(@name,n,1)
from numbers
where n<=LEN(@name)

如果您有一个表,那么解决这个问题很简单。不需要循环或游标,因此性能比其他解决方案好几个数量级:

declare @name varchar(10)='ABCDEF'

select @name,SUBSTRING(@name,n,1)
from numbers
where n<=LEN(@name)

您可以使用CTE将字符串中的每个字符解析到新行:

DECLARE @data varchar(200) = 'ABCDEF'

;WITH CTE AS (
    SELECT
        1 as CharacterPosition,
        SUBSTRING(@data,1,1) as Character
    UNION ALL
    SELECT
        CharacterPosition + 1,
        SUBSTRING(@data,CharacterPosition + 1,1)
    FROM
        CTE
    WHERE CharacterPosition < LEN(@data)
)
SELECT Character
FROM CTE

您可以使用CTE将字符串中的每个字符解析到新行:

DECLARE @data varchar(200) = 'ABCDEF'

;WITH CTE AS (
    SELECT
        1 as CharacterPosition,
        SUBSTRING(@data,1,1) as Character
    UNION ALL
    SELECT
        CharacterPosition + 1,
        SUBSTRING(@data,CharacterPosition + 1,1)
    FROM
        CTE
    WHERE CharacterPosition < LEN(@data)
)
SELECT Character
FROM CTE

你想干什么?这是一个非常不寻常的要求。在客户端或作为ETL脚本的一部分,字符串处理要容易得多。在每个字母中使用一行也是非常不寻常的,请更清楚地了解您需要什么,您试图解决的真正问题是什么?你可以用一种更简单的方法来解决这个问题。你想为一个用户或所有用户解决这个问题吗?你试过什么了吗?到目前为止你试过什么?你想做什么?这是一个非常不寻常的要求。在客户端或作为ETL脚本的一部分,字符串处理要容易得多。在每个字母中使用一行也是非常不寻常的,请更清楚地了解您需要什么,您试图解决的真正问题是什么?你可以用一种更简单的方法来解决这个问题。你想为一个用户或所有用户解决这个问题吗?你试过什么了吗?到目前为止你试过什么?