如何循环通过CTE并读取记录



我使用CTE来获取记录,并在CTE中循环,并对数据执行一些操作。

这是表格

表A

Id | Name
---+-----------------------------
1  | Samuel,Jack
2  | Williams,In: Edison,Thomas
3  | Wick,John : Isac, Newton

我正在创建一个CTE来筛选数据中包含":"的记录。

;WITH cte
( 
SELECT Name AS filteredNames 
FROM TableA 
WHERE Name LIKE '%:%'
)

SELECT * FROM cte将返回类似于下方的行

filteredNames
--------------
Williams,In: Edison,Thomas
Wick,John : Isac, Newton

我想从CTE中逐行读取,并执行逻辑以交换由','分隔的名称,保持名称上的':'

最终输出应该是这样的:

finalOutput
--------------
In,Williams: Thomas,Edison
John, Wick  :  Newton,Isac

我需要将每一行设置为可变的,比如

DECLARE @tempName nvarchar(500)
SET @tempName = SELECT filteredNames FROM cte

我想循环通过cte,并将每一行值设置为@tempName变量,并对@tempname执行逻辑。

请让我知道我们如何逐行阅读。有没有机会不使用光标?

这里有一个你可以做什么的例子。请放一些额外的测试用例,看看它是否适合你。如果是这样,我会想出一个update语句来更新数据

DECLARE 
@Table TABLE (
ID INT,
Nme VARCHAR(100)
)
INSERT INTO @Table (ID,Nme)
VALUES 
(1,'Samuel,Jack'),
(2,'Williams,In: Edison,Thomas'),
(3,'Wick,John : Isac, Newton')

-- Shows input and output
SELECT 
ID,
Nme,
LName1 + ',' + FName1 + ':' + LName2 + ',' + FName2 Result
FROM
(
SELECT 
ID,
Nme,
TRIM(LEFT(Nme,FirstComma-1)) FName1,
TRIM(SUBSTRING(Nme,FirstComma+1,Colon-FirstComma-1)) LName1,
TRIM(SUBSTRING(Nme,Colon+1, SecondComma-Colon-1)) FName2,
TRIM(RIGHT(Nme,LEN(Nme)-SecondComma)) LName2
FROM
(
SELECT
CHARINDEX(':',Nme) Colon,
CHARINDEX(',',Nme) FirstComma,
CHARINDEX(',',Nme,CHARINDEX(',',Nme)+1) SecondComma,
*
FROM @Table WHERE Nme LIKE '%:%'
) as A
) as B
-- Actually do the update

最新更新