我到处搜索过,我无法在任何地方找到这种实现方式。
我想说的是:QWERTY
我想获得这张表:
Q
W
E
R
T
Y
或者QWERTY AnotherWord
我想获得
Q
W
E
R
T
Y
[space character here]
A
n
o
t
h
e
r
W
o
r
d
答案 0 :(得分:25)
这样做:
select substring(a.b, v.number+1, 1)
from (select 'QWERTY AnotherWord' b) a
join master..spt_values v on v.number < len(a.b)
where v.type = 'P'
答案 1 :(得分:4)
在这里你拥有它:
create table #words (
character varchar(1)
)
declare @test varchar(10)
select @test = 'QWERTY'
declare @count int, @total int
select @total = len(@test), @count = 0
while @count <= @total
begin
insert into #words select substring(@test, @count, 1)
select @count = @count + 1
end
select * from #words
drop table #words
答案 2 :(得分:1)
请避免引用系统表,特别是系统数据库中的系统表。实际上,上面选择的答案可能无法在Visual Studio 2013数据库项目中编译
表变量很好,但使用CTE递归就是答案:
DECLARE @str VARCHAR(max)
SET @str = 'QWERTY AnotherWord'
WITH Split(stpos,endpos)
AS(
SELECT 1 AS stpos, 2 AS endpos
UNION ALL
SELECT endpos, endpos+1
FROM Split
WHERE endpos <= LEN(@str)
)
SELECT
'character' = SUBSTRING(@str,stpos,COALESCE(NULLIF(endpos,0),LEN(@str)+1)-stpos)
,'charindex' = stpos
FROM Split
也就是说,上面代码的用法是获得一个表格,代表用户不同的权限。这不是这样做的方法。创建一个包含ID,权限代码和描述的表,然后在users表和新权限表之间创建一个链接表。这给了你相同的能力,并没有让你解决这样的愚蠢问题。
答案 3 :(得分:1)
Declare @word nvarchar(max)
Select @word = 'Hello This is the test';
with cte (Number)as
(Select 1
union all
select Number +1 From cte where number <len(@word)
)
select * from Cte Cross apply (Select SUBSTRING(@word,number,1 ) ) as J(Letter)
答案 4 :(得分:1)
这是一个表值函数(源自aF的临时表实现)。它与aF的实现略有不同,因为它以@count=1
开头;这排除了多余的领导空间。
CREATE FUNCTION [dbo].[Chars] (@string VARCHAR(max))
RETURNS @chars TABLE (character CHAR)
AS
BEGIN
DECLARE @count INT,
@total INT
SELECT @total = Len(@string),
@count = 1
WHILE @count <= @total
BEGIN
INSERT INTO @chars
SELECT Substring(@string, @count, 1)
SELECT @count = @count + 1
END
RETURN
END
用法:
SELECT * FROM dbo.chars('QWERTY AnotherWord')