替换SQL Server中的逗号分隔值

Hir*_*iya 1 sql t-sql sql-server sql-server-2008

我有两个SQL表EmployeeMst和EmployeeCity

EmployeeMst
SrNo  Name 
1     abc
2     xyz
3     pqr
4     def

EmployeeCity
srno  City     EmplSrNo
1     Delhi    1,2,3,4
2     Mumbai   2,3,1
3     New York 3,2
Run Code Online (Sandbox Code Playgroud)

我想从EmployeeMst获取具有选择查询的员工姓名

输出如下:

srno City          EmployeeName
1    Delhi         abc,xyz,pqr,def
2    Mumbai        xyz,pqr,abc
3    New York      pqr,xyz
Run Code Online (Sandbox Code Playgroud)

这张表中有几个数据.请告诉我如何才能这样做

我用过charindex但需要更多时间.

Gar*_*thD 5

我仍然认为无论桌子是旧的还是新的,你都应该花时间尽快修复糟糕的设计.你只是在推迟不可避免的事情.因此,这里有一些让你开始规范化设计的东西:

-- CREATE CITY TABLE
CREATE TABLE dbo.City
(
    SrNo INT,
    City VARCHAR(50)
);

-- POPULATE FROM EXISTING TABLE
INSERT dbo.City (SrNo, City)
SELECT  SrNo, City
FROM    dbo.EmployeeCity;

-- CREATE CITY-EMPLOYEE JUNCTION TABLE USING EXISTING
-- DATA, AND XML METHOD TO SPLIT COMMA SEPARATED VALUES
-- INTO ROWS
CREATE TABLE dbo.EmployeeCity2 (CitySrNo, EmployeeSrNo)
SELECT  SrNo, i.value('.', 'INT')
FROM    (   SELECT  SrNo,
                    x = CONVERT(XML, '<i>' + 
                                REPLACE(EmplSrNo, ',', '</i><i>') + 
                                '</i>')
            FROM    dbo.EmployeeCity
        ) AS t
        CROSS APPLY t.x.nodes('i') rx (i);

-- DROP EXISTING TABLE SO THAT WE CAN CREATE A VIEW OF THE SAME NAME
DROP TABLE dbo.EmployeeCity;
GO

-- CREATE A VIEW THAT REPLICATES THE FORMAT OF THE CURRENT TABLE SO
-- THAT EXISTING SELECT QUERIES ARE NOT AFFECTED
CREATE VIEW dbo.EmployeeCity
AS
    SELECT  c.SrNo,
            c.City,
            EmplSrNo = STUFF((  SELECT  ',' + CAST(EmployeeSrNo AS VARCHAR(10))
                                FROM    dbo.EmployeeCity2 AS ec
                                WHERE   ec.CitySrNo = c.SrNo
                                FOR XML PATH(''), TYPE
                            ).value('.', 'VARCHAR(MAX)'), 1, 1, '')
    FROM    dbo.City AS c;
GO

-- FINALLY, THE QUERY YOU NEED TO GET THE OUTPUT IN THE QUESTION
SELECT  c.SrNo,
        c.City,
        EmployeeName = STUFF((  SELECT  ',' + m.Name
                                FROM    dbo.EmployeeCity2 AS ec
                                        INNER JOIN EmployeeMst AS m
                                            ON m.SrNo = ec.EmployeeSrNo
                                WHERE   ec.CitySrNo = c.SrNo
                                FOR XML PATH(''), TYPE
                            ).value('.', 'VARCHAR(MAX)'), 1, 1, '')
FROM    dbo.City AS c;
Run Code Online (Sandbox Code Playgroud)

您仍然需要修改数据的插入/更新/删除方式,但是发生这种情况的位置应该比选择的位置少得多,并且视图将覆盖您现有的所有选择查询.

要进一步阅读上面使用的几个原则来拆分逗号分隔的字符串,然后再将它重新组合在一起,请参阅: