2012-02-21 116 views
1

這裏很多級聯的職位,但似乎無法找到解決這個:串聯多列到一個逗號分隔字符串,並插入到新表

ID:

我有20列的表山口1列2列3欄4等....

我需要連接所有列在一起,使得我有兩列:

ID MasterCommaDelimColumn

然後我需要將它插入到一個新表中。問題似乎是逗號。我可以將所有內容連接在一起,但是當我添加逗號時,它將它們視爲單獨的列,並且插入失敗。

編輯:

DECLARE @SQL varchar(MAX) 
CREATE TABLE #AgesServedGroup(
     provider_id INT, Infant VarChar(4), Preschool VarChar(4), 
     SchoolAge VarChar(4), Adolescent VarChar(4), YoungAdult VarChar(4), 
     Transition VarChar(4), Adult VarChar(4), Senior VarChar(4)) 

BEGIN 
    SET @SQL = 'INSERT INTO #AgesServedGroup (provider_id, Infant, Preschool, 
       SchoolAge,Adolescent,YoungAdult,Transition,Adult,Senior) 
      SELECT provider_id, 
      CASE WHEN provider_age_served_infant = 1 THEN 8 END AS Infant, 
      CASE WHEN provider_age_served_pre_school = 1 THEN 13 END AS Preschool, 
      CASE WHEN provider_age_served_school_age = 1 THEN 12 END AS SchoolAge, 
      CASE WHEN provider_age_served_adolescent = 1 THEN 76 END AS Adolescent, 
      CASE WHEN provider_age_served_young_adult = 1 THEN 77 END AS YoungAdult, 
      CASE WHEN provider_age_served_transition = 1 THEN 78 END AS Transition, 
      CASE WHEN provider_age_served_adult = 1 THEN 79 END AS Adult, 
      CASE WHEN provider_age_served_senior = 1 THEN 80 END AS Senior 
      FROM dbo.provider_age_served' 
    EXEC (@SQL); 
END 

--Combine the ages served code 
CREATE TABLE #AgesServed(
     provider_id int, 
     AgesServed VarChar(100)) 

BEGIN 
    SET @SQL = 'INSERT INTO #AgesServed (provider_id, AgesServed) 
       SELECT provider_id, Infant + Preschool + SchoolAge + 
         Adolescent + YoungAdult + Transition + Adult + Senior 
       FROM #AgesServedGroup' 
    EXEC (@SQL); 
END 

INSERT INTO ProviderExport (link_name, cat_id, link_featured) 
SELECT provider_id,CONVERT(varchar(100),AgesServed), 0 
FROM #AgesServed 

DROP TABLE #AgesServedGroup 
DROP TABLE #AgesServed 

再次編輯

--Create the Ages Served Codes 
    CREATE TABLE #AgesServedGroup(
    provider_id INT, Infant VarChar(4), Preschool VarChar(4), SchoolAge VarChar(4), Adolescent VarChar(4), 
    YoungAdult VarChar(4), Transition VarChar(4), Adult VarChar(4), Senior VarChar(4)) 

    BEGIN 
    INSERT INTO #AgesServedGroup (provider_id, Infant, Preschool, SchoolAge,Adolescent,YoungAdult, Transition,Adult,Senior) 
    SELECT provider_id, CASE WHEN provider_age_served_infant = 1 THEN 8 END AS Infant, 
      CASE WHEN provider_age_served_pre_school = 1 THEN 13 END AS Preschool, 
      CASE WHEN provider_age_served_school_age = 1 THEN 12 END AS SchoolAge, 
      CASE WHEN provider_age_served_adolescent = 1 THEN 76 END AS Adolescent, 
      CASE WHEN provider_age_served_young_adult = 1 THEN 77 END AS YoungAdult, 
      CASE WHEN provider_age_served_transition = 1 THEN 78 END AS Transition, 
      CASE WHEN provider_age_served_adult = 1 THEN 79 END AS Adult, 
      CASE WHEN provider_age_served_senior = 1 THEN 80 END AS Senior 
    FROM dbo.provider_age_served   
    END 

    --Combine the ages served code 
    CREATE TABLE #AgesServed(
    provider_id int, AgesServed VarChar(100)) 

    BEGIN 
    INSERT INTO #AgesServed (provider_id, AgesServed) SELECT provider_id, 
    CASE WHEN Infant Is Not Null THEN Infant + ',' ELSE '' END + 
    CASE WHEN Preschool Is Not Null THEN Preschool + ',' ELSE '' END + 
    CASE WHEN SchoolAge Is Not Null THEN SchoolAge + ',' ELSE '' END + 
    CASE WHEN Adolescent Is Not Null THEN Adolescent + ',' ELSE '' END + 
    CASE WHEN YoungAdult Is Not Null THEN YoungAdult + ',' ELSE '' END + 
    CASE WHEN Transition Is Not Null THEN Transition + ',' ELSE '' END + 
    CASE WHEN Adult Is Not Null THEN Adult + ',' ELSE '' END + 
    CASE WHEN Senior Is Not Null THEN Senior ELSE '' END FROM #AgesServedGroup  
    END 

    --Add the ages served master code 
    BEGIN 
    UPDATE #AgesServed SET AgesServed = '1,' + AgesServed WHERE AgesServed <> '' 
    END 

    --Trim the trailing comma 
    BEGIN 
    UPDATE #AgesServed SET AgesServed = LEFT(AgesServed, len(AgesServed) -1) WHERE RIGHT(AgesServed,1) = ',' 
    END 

回答

1

對於它要依賴於數據類型的列,如果他們可以爲空MS-SQL,但是像這應該工作,如果一切都是* char類型而不是null。

select 1 as id 
     ,'Hello' as col1 
     ,' ' as col2 
     ,'world' as col3 
     ,'!' as col4 
into newtable_tbl 

select id 
     , col1 + ',' + col2 + ',' + col3 + ',' + col4 
from newtable_tbl 
1

首先,這聽起來像一個可怕的想法。

但這是它的樣子。

create table #ccat (id int identity (1,1) primary key, MasterCommaDelimColumn varchar(max)); 

Insert into #ccat (MasterCommaDelimColumn) 
Select cast(c1 as varchar) 
     + ','+ cast(c2 as varchar) 
     + ','+ cast(c3 as varchar) 
from (values(1,2,3),(3,4,5),(6,7,8))g(c1,c2,c3); 

select * from #ccat; 

drop table #ccat; 
+0

我不明白'從'。什麼是'g'? Im在ms sql中。 – 2012-02-21 01:45:02

+0

'from(...)'語法是從子查詢中選擇的,子查詢需要有一個名稱。我用「g」作爲子查詢名稱。 Sql2008允許使用值列表作爲子查詢的等價物。所以,我從一個名爲g的虛擬表中查詢。 – jmoreno 2012-02-21 02:40:02

+0

@jmoreno - 我想你忘了把整個東西都用引號括起來,所以它被INSERT – Leigh 2012-02-21 16:49:03