[英]cte in sql server with temp table and split string
我有两个列ID和权限的表。 权限列将以0,1格式(例如“ 010111100000000 .... 250次”)保留250个固定字符。 现在,我必须拆分权限列字符串,并在临时表中获取结果,该表将具有结构ID,权限(0或1),位置(1至250)。 假设我最初有5行,那么在临时表中我将获得5 * 250 = 1250行。
我已经分割了单个字符串并使用了光标,但是现在我想避免使用光标。 我如何实现这一目标。
declare @temp table(Chars int not null, RowID int not null)
--Split the rights string into 250 char rows with RowID as each position
;with cte as
(
select substring(@rights, 1, 1) as Chars,
stuff(@rights, 1, 1, '') as rights,
1 as RowID
union all
select substring(rights, 1, 1) as Chars,
stuff(rights, 1, 1, '') as rights,
RowID + 1 as RowID
from cte
where len(rights) > 0
)
--Get the values in a temporary table except 0
insert into @temp select Chars, RowID from cte option (MAXRECURSION 300);
那这个呢?
这个想法是:获取250个连续数字的列表,并使用SUBSTRING
从每个位置读取一个字符:
DECLARE @tbl TABLE (ID INT IDENTITY,Rights VARCHAR(250));
INSERT INTO @tbl VALUES
('1011101110000101010111000...'), ('0100010111100010101...');
WITH Nr250 AS
(SELECT TOP 250 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Nr FROM master.dbo.spt_values)
SELECT t.ID
,t.Rights
,Nr AS Position
,SUBSTRING(t.Rights,Nr,1) AS PosDigit
--INTO #SomeTempTable
FROM Nr250
CROSS JOIN @tbl AS t
如果要将其写入临时表,只需在INTO
之前删除--
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.