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,我完全理解。过去多年来一直是这样。情不自禁。我不确定你是否记得,但你以前回答过一个类似的问题--。这个问题是不同的(它对数据格式有相同的反应)。它并不是试图在适当的位置进行替换。你真的应该修正你的数据格式。这在目前是不可能的,用给定的数据格式可以实现吗?谢谢你的帮助:)