SQL server varchar.toArray()或string.toArray()方法

SQL server varchar.toArray()或string.toArray()方法,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想在sql server中将字符串数据转换为数组。 我试过了,就像下面一样 SELECT '223456789' AS SerialOriginalCode -- SerialOriginalCode 223456789 DECLARE @tbl_SerialOriginalVerion TABLE(ID INT, SerialOriginalCode INT); INSERT INTO @tbl_SerialOriginalVerion VALUES (1, 2), (2, 2), (3,

我想在sql server中将字符串数据转换为数组。 我试过了,就像下面一样

SELECT '223456789' AS SerialOriginalCode
-- SerialOriginalCode 223456789
DECLARE @tbl_SerialOriginalVerion TABLE(ID INT, SerialOriginalCode INT);
INSERT INTO @tbl_SerialOriginalVerion VALUES
(1, 2),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8),
(9, 9);
SELECT * FROM @tbl_SerialOriginalVerion
但这是手动方式,不是编程转换方式,因为它需要我输入每行的每个插入值

有人能给我推荐一种更简单的方法吗?

尝试使用master..spt\u值中的数字进行插入


我建议您在应用程序中这样做。SQL针对基于集合的操作进行了优化,并且不处理类似的递归过程任务

如果要在SQL中执行此操作,可以找到字符串的LEN,然后递归地找到下一个字符。像这样的

质疑

输出

使用cte并应用:

Declare @s nvarchar(9) = '223456789'

;with cte as(
select n from (values(1),(2),(3),(4),(5),(6),(7),(8),(9)) as t(n))
select * from cte
cross apply(select substring(@s, cte.n, 1) as c) ca
输出:

n   c
1   2
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
或者,您也可以使用理货台:

declare @s varchar(100) = '223456789'

;with t as(select row_number() over(order by (select null)) rn from
          (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t1(n) cross join
          (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t2(n))
select substring(@s, rn, 1) from t
where rn <= len(@s)

Fiddle

我建议您在应用程序端执行此操作。数据库没有针对此类递归过程任务进行优化。我认为SQL Server不支持这两种方法中的任何一种:varchar.toArray或string.toArray方法它只适用于具有精确9个字符的字符串。对于我的原因,精确9个字符就足够了@ughai。感谢您的帮助@ughai。如果您可以提交自定义函数TRY_CONVERT,则会更有帮助如果您使用的是SQL Server 2014之前的任何版本,请使用TRY_CONVERT,而不是TRY_CONVERT谢谢@ughai的持续帮助
DECLARE @SerialOriginalCode VARCHAR(20) = '223456789'

DECLARE @tbl_SerialOriginalVerion TABLE(ID INT, SerialOriginalCode INT);

DECLARE @len INT = LEN(@SerialOriginalCode)
;WITH CTE as 
(
SELECT 1 as ID,CONVERT(INT,SUBSTRING(@SerialOriginalCode,1,1)) as CharInt
UNION ALL 
SELECT ID + 1,CONVERT(INT,SUBSTRING(@SerialOriginalCode,ID + 1,1))
FROM CTE WHERE LEN(@SerialOriginalCode) >= ID + 1
)
INSERT INTO @tbl_SerialOriginalVerion(ID,SerialOriginalCode)
SELECT * FROM CTE;

SELECT * FROM @tbl_SerialOriginalVerion
ID  SerialOriginalCode
1   2
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
Declare @s nvarchar(9) = '223456789'

;with cte as(
select n from (values(1),(2),(3),(4),(5),(6),(7),(8),(9)) as t(n))
select * from cte
cross apply(select substring(@s, cte.n, 1) as c) ca
n   c
1   2
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
declare @s varchar(100) = '223456789'

;with t as(select row_number() over(order by (select null)) rn from
          (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t1(n) cross join
          (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t2(n))
select substring(@s, rn, 1) from t
where rn <= len(@s)