Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 拆分SQL中的列值并显示在下一行中_Sql Server 2008 - Fatal编程技术网

Sql server 2008 拆分SQL中的列值并显示在下一行中

Sql server 2008 拆分SQL中的列值并显示在下一行中,sql-server-2008,Sql Server 2008,我想要这样的输出 ID NAME TYPE 1 ABC 1,2,3,4 2 PQR 2,3,5 3 XYZ 1,4 4 TCS 3,1 5 PPP 2,3 等等这方面有两个基本挑战;拆分以逗号分隔的值列表,然后仅显示ID和NAME的第一个实例。可能有更有效或更优雅的方法来实现这一点。然而,我选择了使用光标的暴力方法。给你 ID NAME TYPE 1 ABC 1

我想要这样的输出

ID   NAME     TYPE
1    ABC      1,2,3,4
2    PQR      2,3,5 
3    XYZ      1,4
4    TCS      3,1
5    PPP      2,3

等等

这方面有两个基本挑战;拆分以逗号分隔的值列表,然后仅显示ID和NAME的第一个实例。可能有更有效或更优雅的方法来实现这一点。然而,我选择了使用光标的暴力方法。给你

ID   NAME     TYPE
1    ABC      1
              2
              3
              4
2    pqr      2
              3
              5 
享受


Noel

那么你只想删除逗号?如果是,请使用“替换”功能。然而,我觉得我肯定遗漏了什么。删除逗号并在下一行显示值
IF OBJECT_ID('tempdb..#Temp', 'U') IS NOT NULL DROP TABLE #Temp;
IF OBJECT_ID('tempdb..#Results', 'U') IS NOT NULL DROP TABLE #Results;

CREATE TABLE #Temp (
  ID INT
, NAME CHAR(3)
, TYPE VARCHAR(10)
)

CREATE TABLE #Results (
  ID VARCHAR(3)
, NAME CHAR(3)
, TYPE VARCHAR(10)
)

INSERT  INTO #Temp (ID, NAME, TYPE) VALUES (1, 'ABC', '1,2,3,4')
INSERT  INTO #Temp (ID, NAME, TYPE) VALUES (2, 'PQR', '2,3,5')
INSERT  INTO #Temp (ID, NAME, TYPE) VALUES (3, 'XYZ', '1,4')
INSERT  INTO #Temp (ID, NAME, TYPE) VALUES (4, 'TCS', '3,1')
INSERT  INTO #Temp (ID, NAME, TYPE) VALUES (5, 'PPP', '2,3')

DECLARE @First BIT
DECLARE @ValueList VARCHAR(100)
DECLARE @pos INT
DECLARE @len INT
DECLARE @value VARCHAR(100)

/* declare cursor variables */
DECLARE @ID INT
DECLARE @NAME CHAR(3)
DECLARE @TYPE VARCHAR(10)

DECLARE MyCursor CURSOR FAST_FORWARD READ_ONLY
FOR
SELECT * FROM #Temp

OPEN MyCursor

FETCH NEXT FROM MyCursor INTO @ID, @NAME, @TYPE

WHILE @@FETCH_STATUS = 0
BEGIN

    SET @ValueList = @TYPE + ','
    SET @pos = 0
    SET @len = 0
    SET @First = 1

    WHILE CHARINDEX(',', @ValueList, @pos + 1) > 0
    BEGIN
        SET @len = CHARINDEX(',', @ValueList, @pos + 1) - @pos
        SET @value = SUBSTRING(@ValueList, @pos, @len)
        SET @pos = CHARINDEX(',', @ValueList, @pos + @len) + 1

        IF (@First = 1)
        BEGIN
            INSERT INTO #Results (ID, NAME, TYPE) VALUES (@ID, @NAME, @value)
        END
        ELSE
        BEGIN
            INSERT INTO #Results (ID, NAME, TYPE) VALUES ('', '', @value)
        END
        SET @First = 0
    END

    FETCH NEXT FROM MyCursor INTO @ID, @NAME, @TYPE
END

CLOSE MyCursor
DEALLOCATE MyCursor

SELECT * FROM #Results