如何将n列连接成一列?

Fre*_*dou 1 sql-server

我的目标是,如果我有这个:

colmuns      c1 | c2 | c3 | c4 | c5 | n..
row1          a |  a |  a |  a |  a | 
row2          b |  b |  b |  b |  b |
rowN...
Run Code Online (Sandbox Code Playgroud)

我想做一个会返回的查询

   myCol
   aaaaa
   bbbbb
   nnnnn...
Run Code Online (Sandbox Code Playgroud)

我知道我能做到这一点

select t2.id, (
    select  *
    from mytable t1
    where t1.id= t2.id
    for xml path('')) as row
from mytable t2
Run Code Online (Sandbox Code Playgroud)

并且它会将包含许多列的整行放入我想要的一列中

现在,如何过滤掉xml标签?

或者还有其他解决方案吗?

编辑 列可能为null不是varchar,可以是int,varchar,date等

mjv*_*mjv 5

你可以简单地使用T-SQL的字符串连接运算符'+'

SELECT c1 + c2 + c3 + c4 + c5 + ...
FROM myTable
Run Code Online (Sandbox Code Playgroud)

如果某些列可能包含空值,您可以使用ISNULL()函数,如

SELECT ISNULL(c1, '') + ISNULL(c2, 'x') + ...  -- note how you can substribute NULLs with any desired value
FROM myTable
Run Code Online (Sandbox Code Playgroud)

您可以通过访问SQL Server元数据来动态创建此类SELECT语句:

SELECT COLUMN_NAME, *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'myTable'
   AND DATA_TYPE IN ('char', 'varchar') -- can further filter out non desired colums
order by ORDINAL_POSITION    -- and also pick a given order
Run Code Online (Sandbox Code Playgroud)

例如

DECLARE @SqlStmt AS VARCHAR(8000)
DECLARE @Ctr AS INT
DECLARE @ColName AS VARCHAR(80)

DECLARE colCursor CURSOR 
   FOR SELECT COLUMN_NAME
   FROM INFORMATION_SCHEMA.COLUMNS
   WHERE table_name = 'myTable'
      AND DATA_TYPE IN ('char', 'varchar')
  ORDER BY  ORDINAL_POSITION
  FOR READ ONLY;

OPEN colCursor;

SET @Ctr = 0
SET @SqlStmt = 'SELECT '

FETCH NEXT FROM colCursor INTO @colName;
WHILE @@FETCH_STATUS = 0
BEGIN
    IF @Ctr > 0
    BEGIN
        SET @SqlStmt = @SqlStmt + ' + '; -- w/o the spaces if size is a pb
    END
    SET @Ctr = @Ctr + 1;
    SET @SqlStmt = @SqlStmt + @ColName;   -- w/ ISNULL if needed...

    FETCH NEXT FROM colCursor INTO @colName;
END;
CLOSE colCursor
DEALLOCATE colCursor

SET @SqlStmt = @SqlStmt + ' FROM ' + 'myTable'
-- Here to add to @SqlStmt (WHERE clause, other columns, other 
-- tables/join whatever...

PRINT @SqlStmt  -- OR EXEC() it ...
Run Code Online (Sandbox Code Playgroud)