SQL查询以打印字符串的每个字符:SQL server

SQL查询以打印字符串的每个字符:SQL server,sql,sql-server,Sql,Sql Server,正在尝试编写查询以分别打印字符串的每个字符。我试过以下方法 select substring('sas',1,1) union all select substring('sas',2,1) union all select substring('sas',3,1) 但我必须为每个角色运行联合。有更好的办法吗 沙盒:我真的不喜欢在这样的任务中使用rCTE,因为这样的任务是迭代的,而且速度很慢(比计数慢得多,特别是当超过几行时)。你可以用一个计分表,这样做要快得多。作为一个TVF,它会像这样:

正在尝试编写查询以分别打印字符串的每个字符。我试过以下方法

select substring('sas',1,1)
union all
select substring('sas',2,1)
union all
select substring('sas',3,1)

但我必须为每个角色运行联合。有更好的办法吗


沙盒:

我真的不喜欢在这样的任务中使用rCTE,因为这样的任务是迭代的,而且速度很慢(比计数慢得多,特别是当超过几行时)。你可以用一个计分表,这样做要快得多。作为一个TVF,它会像这样:

CREATE FUNCTION dbo.GetChars (@String varchar(8000))
RETURNS table
AS RETURN
    WITH N AS(
        SELECT N
        FROM(VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
    Tally AS(
        SELECT TOP (LEN(@String)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
        FROM N N1, N N2, N N3, N N4)
    SELECT SUBSTRING(@String, T.I, 1) AS C, T.I
    FROM Tally T;
GO


请注意,这在SQL Server 2005上不起作用。

您也可以尝试一下

DECLARE @data VARCHAR(100) = 'TEST'

Declare @cnt int = len(@data)
Declare @i int =1
While (@i <= @cnt)
BEGIN

PRint SUBSTRING(@data,@i,1)


set @i=@i+1


END
DECLARE@data VARCHAR(100)='TEST'
声明@cnt int=len(@data)
声明@i int=1

虽然(@i可能有帮助-这回答了你的问题吗?你在这里标记了2个完全不受支持的SQL Server版本。2008年夏天失去了支持,2005年已经失去了支持多年,你真的*应该尽快查看升级路径。2005年肯定知道安全漏洞。现在你已经删除了这些标记。那么您实际使用的SQL Server版本是什么呢?您也可以基于此CTE编写一个表函数。这其中有两点。
ISNUMERIC
是一个非常糟糕的函数。我意识到OP最初标记为2005/2008,但它的使用应该避免。它提供了误报和否定。考虑到OP已经删除了对于这些标记,
TRY\u CONVERT
现在将是一个更好的函数。而且
不是带有
表达式的
的一部分,它是一个语句终止符;它位于每个语句的末尾。您还有一个事实,即这是一个迭代任务,因此使用更长的字符串时速度会更慢。尝试编译此代码时出现错误:ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效,除非还指定了TOP、OFFSET或FOR XML“这是一个简单的修复@Маааааааааааааааааааа1072。
DECLARE @data VARCHAR(100) = 'TEST'

Declare @cnt int = len(@data)
Declare @i int =1
While (@i <= @cnt)
BEGIN

PRint SUBSTRING(@data,@i,1)


set @i=@i+1


END