SQL server varchar.toArray()或string.toArray()方法
我想在sql server中将字符串数据转换为数组。 我试过了,就像下面一样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,
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)