SQL字符串连接到表
给几个字符串作为SQL字符串连接到表,sql,sql-server,Sql,Sql Server,给几个字符串作为 SET @Codes1 = 3,4 SET @Codes2 = 1 SET @Codes3 = --empty 表——TblCode Id Code 1 A 2 B 3 C 4 D 如何将带有联接的@Codes1、@Codes2、@Codes3转换为表TblCode,以便返回以下输出: 1. @Codes1 = CD 2. @Codes2 = A 3. @Codes3 = --empty 请注意,输出的串联没有逗号 PS-这是一个更大
SET @Codes1 = 3,4
SET @Codes2 = 1
SET @Codes3 = --empty
表——TblCode
Id Code
1 A
2 B
3 C
4 D
如何将带有联接的@Codes1、@Codes2、@Codes3
转换为表TblCode
,以便返回以下输出:
1. @Codes1 = CD
2. @Codes2 = A
3. @Codes3 = --empty
请注意,输出的串联没有逗号
PS-这是一个更大更复杂数据集的小例子。请忽略任何错误的设计模式。您可以尝试一下。我只为@Codes1添加了答案,但它也适用于@Codes2和@Codes3
DECLARE @TblCode TABLE (Id INT, Code VARCHAR(2))
INSERT INTO @TblCode
VALUES(1, 'A'),
(2,'B'),
(3,'C'),
(4,'D')
DECLARE @Codes1 VARCHAR(10) = '3,4'
DECLARE @Codes2 VARCHAR(10) = '1'
DECLARE @Codes3 VARCHAR(10) = NULL
DECLARE @CodesOut VARCHAR(10) = ''
;WITH CTE_1 AS (
SELECT CODE= @Codes1 + ','
)
, CTE_2 AS -- It silit text to rows
(
SELECT RIGHT(CTE_1.CODE, LEN(CTE_1.CODE) - CHARINDEX(',',CTE_1.CODE)) CODE , SUBSTRING(CTE_1.CODE, 0, CHARINDEX(',',CTE_1.CODE)) ID, CHARINDEX(',',CTE_1.CODE) AS CI
FROM CTE_1
UNION ALL
SELECT RIGHT(CTE_2.CODE, LEN(CTE_2.CODE) - CHARINDEX(',',CTE_2.CODE)) CODE , SUBSTRING(CTE_2.CODE, 0, CHARINDEX(',',CTE_2.CODE)) ID, CHARINDEX(',',CTE_2.CODE) AS CI
FROM CTE_2 WHERE LEN(CTE_2.CODE) > 0
)
SELECT @CodesOut = @CodesOut + C.Code FROM CTE_2 INNER JOIN @TblCode C ON CTE_2.ID = C.Id
SELECT @CodesOut
结果:
CD
您可以使用递归CTE。这里有一种方法:
with c as (
select c.*, row_number() over (partition by id) as seqnum
from c
),
cte as (
select cast(@codes as varchar(max)) as str,
replace(@codes, id, code) as newstr,
1 as lev
from c
where seqnum = 1
union all
select str, replace(newstr, id, code), lev + 1
from cte join
c
on c.seqnum = cte.lev + 1
)
select top (1) newstr
from cte
order by lev desc;
如果语法中有错误,请设置SQL Fiddle或Rextester或类似的工具,以便对其进行修复。不要将代码存储在逗号分隔的字符串中。你的代码会简单得多。@GordonLinoff,我完全理解。过去多年来一直是这样。情不自禁。我不确定你是否记得,但你以前回答过一个类似的问题--。这个问题是不同的(它对数据格式有相同的反应)。它并不是试图在适当的位置进行替换。你真的应该修正你的数据格式。这在目前是不可能的,用给定的数据格式可以实现吗?谢谢你的帮助:)