Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将类型字符串编号拆分为字符列表_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 将类型字符串编号拆分为字符列表

Sql 将类型字符串编号拆分为字符列表,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个包含字母数字字符串的列,比如123x758v961j 我需要将这个字母数字拆分为字符,并在值之间留有空格 示例:123x758v961j===>123x758v961j 我需要一个返回此解决方案的函数。使用将字符串拆分为单个字符,然后使用经典的XML路径和填充解决方案将字符组合回您可以执行以下操作: SELECT V.S, STUFF((SELECT ' ' + NG.token FROM dbo.NGrams8k(V.S,1) NG

我有一个包含字母数字字符串的列,比如123x758v961j

我需要将这个字母数字拆分为字符,并在值之间留有空格

示例:123x758v961j===>123x758v961j

我需要一个返回此解决方案的函数。

使用将字符串拆分为单个字符,然后使用经典的XML路径和填充解决方案将字符组合回您可以执行以下操作:

SELECT V.S,
       STUFF((SELECT ' ' + NG.token
              FROM dbo.NGrams8k(V.S,1) NG
              ORDER BY NG.position
              FOR XML PATH(''),TYPE).value('.','varchar(100)'),1,1,'') AS S2 --Use a varchar length that is double(-1) then length of your actual data type here
FROM (VALUES('123x758v961j'))V(S);
只是另一种方式

CREATE FUNCTION dbo.SplitToChars(
  @String NVARCHAR(300)
)
RETURNS NVARCHAR(300)
AS
BEGIN
  DECLARE @Result NVARCHAR(300) = '';

  WITH CTE AS
  (
    SELECT 1 N
    UNION ALL
    SELECT N + 1
    FROM CTE
    WHERE N < LEN(@String)
  )
  SELECT @Result = CONCAT(@Result, SUBSTRING(@String, N, 1), N' ')
  FROM CTE;

  RETURN (RTRIM(@Result));
END;

还有一种方法-

DECLARE @str VARCHAR(100)='123x758v961j';

WITH Tally(Nmbr) AS 
(
    SELECT TOP(LEN(@str)) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values
)
SELECT TRIM(
            (
                SELECT ' ' + SUBSTRING(@str,Nmbr,1)
                FROM Tally
                ORDER BY Nmbr
                FOR XML PATH('')
            )
           );
其思想是,在@str中的每个位置使用一个即时计数和一个运行数字列表来逐个读取字符。此派生表已重新关联

而且-只是为了好玩-为了展示各种方法,还有一种方法使用了一个古怪的更新来避免实际发生的事情;-

WITH Tally(Nmbr) AS 
(
    SELECT TOP(LEN(@str)) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values
)
SELECT @str=STUFF(@str,Nmbr,0,' ')
FROM Tally
ORDER BY Nmbr DESC;

SELECT @str;

这是关闭的重复,但链接的问题是提供了过时的方法使用WHILE循环。。。投票决定重新开始这个问题。。。
WITH Tally(Nmbr) AS 
(
    SELECT TOP(LEN(@str)) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values
)
SELECT @str=STUFF(@str,Nmbr,0,' ')
FROM Tally
ORDER BY Nmbr DESC;

SELECT @str;