как объединить n столбцов в один?

моя цель, если у меня есть это:

colmuns c1 | c2 | c3 | c4 | c5 | n.. row1 a | a | a | a | a | row2 b | b | b | b | b | rowN... 

Я хочу сделать запрос, который вернется

  myCol aaaaa bbbbb nnnnn... 

я знаю, что могу сделать это

 select t2.id, ( select * from mytable t1 where t1.id= t2.id for xml path('')) as row from mytable t2 

и он поместит всю строку со многими столбцами в один столбец, как я хочу

теперь, как отфильтровать тег xml?

или есть ли другое решение?

edit column может быть null, не являются varchar, могут быть int, varchar, date и т. д.

пытаться:

 ;with XmlValues as ( select t2.id, ( select * from mytable t1 where t1.id= t2.id for xml path(''), TYPE) as row from mytable t2 ) select x.row.value('.', 'VARCHAR(8000)') as readable FROM XmlValues AS x 

Рабочий образец EDIT :

 DECLARE @YourTable table (c1 int, c2 int, c3 varchar(5), c4 datetime) INSERT INTO @YourTable VALUES (1,2,'abcde','1/1/2009') INSERT INTO @YourTable VALUES (100,200,'zzz','12/31/2009 23:59:59') select t2.c1, ( select * from @YourTable t1 where t1.c1= t2.c1 for xml path(''), TYPE) as row from @YourTable t2 ;with XmlValues as ( select t2.c1, ( select * from @YourTable t1 where t1.c1= t2.c1 for xml path(''), TYPE) as row from @YourTable t2 ) select x.c1,x.row.value('.', 'VARCHAR(8000)') as readable FROM XmlValues AS x 

ВЫВОД:

 c1 row ----------- -------------------------------------------------------------------- 1 <c1>1</c1><c2>2</c2><c3>abcde</c3><c4>2009-01-01T00:00:00</c4> 100 <c1>100</c1><c2>200</c2><c3>zzz</c3><c4>2009-12-31T23:59:59</c4> (2 row(s) affected) c1 readable ----------- ---------------------------------- 1 12abcde2009-01-01T00:00:00 100 100200zzz2009-12-31T23:59:59 (2 row(s) affected) 

EDIT – свободный способ разобрать имена столбцов таблицы из таблиц метаданных, с возможностью форматирования каждого типа данных по желанию и поддержки NULL:

 BEGIN TRY CREATE TABLE YourTable (c1 int, c2 int, c3 varchar(5), c4 datetime) INSERT INTO YourTable VALUES (1,2,'abcde','1/1/2009') INSERT INTO YourTable VALUES (100,200,'zzz','12/31/2009 23:59:59') end try begin catch end catch DECLARE @YourTableName varchar(1000) DECLARE @YourColumns varchar(max) DECLARE @YourQuery varchar(max) SET @YourTableName='YourTable' SELECT @YourColumns=STUFF( (SELECT '+ ' --' ' --any constant string to appear between columns + CASE DATA_TYPE WHEN 'datetime' THEN 'COALESCE(CONVERT(char(23),'+CONVERT(varchar(max),COLUMN_NAME)+',121),''NULL'')' --more datatypes here ELSE 'COALESCE(CONVERT(varchar(max),' + CONVERT(varchar(max),COLUMN_NAME)+'),''NULL'')' END FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = @YourTableName FOR XML PATH('') ), 1, 2, '' ) SET @YourQuery = 'SELECT '[email protected]+' FROM '[email protected] PRINT @YourQuery SELECT * FROM YourTable EXEC (@YourQuery) 

ВЫВОД:

 SELECT COALESCE(CONVERT(varchar(max),c1),'NULL')+ COALESCE(CONVERT(varchar(max),c2),'NULL')+ COALESCE(CONVERT(varchar(max),c3),'NULL')+ COALESCE(CONVERT(char(23),c4,121),'NULL') FROM YourTable c1 c2 c3 c4 ----------- ----------- ----- ----------------------- 1 2 abcde 2009-01-01 00:00:00.000 100 200 zzz 2009-12-31 23:59:59.000 (2 row(s) affected) ------------------------------------------ 12abcde2009-01-01 00:00:00.000 100200zzz2009-12-31 23:59:59.000 (2 row(s) affected) 

Вы можете просто использовать оператор конкатенации строк T-SQL '+'

 SELECT c1 + c2 + c3 + c4 + c5 + ... FROM myTable 

Если некоторые столбцы могут содержать нулевые значения, вы можете использовать функцию ISNULL () , как в

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

Вы можете динамически создавать такие инструкции SELECT , используя метаданные SQL Server:

 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 

Например

 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 ... 

Если все столбцы известны:

 SELECT c1 + c2 + c3 + c4 + c5 AS cAll 

Однако это не сработает, если вы не знаете, что такое все столбцы.

Другими словами, если вы хотите получить запрос для этой конкретной таблицы, он будет работать, но если вам нужен общий запрос, который будет работать с разными таблицами (разные имена столбцов и т. Д.), Вам нужно будет изменить запрос для каждой таблицы, которую вы хотите для синтаксического анализа.

Interesting Posts

Хотите подсчитать отличительные значения в столбце 1 на основе значений столбца 2

Транзакция (идентификатор процесса 84) была заблокирована при блокировке ресурсов другим процессом и была выбрана в качестве жертвы взаимоблокировки

Подключиться к SQL Server из тайм-аута cygwin, из командной строки DOS

Быстрое создание сценариев sql текста sql, основанных на базе sql 2008

Добавить filestream в существующий столбец таблицы

Разделенная строка SQL Server с разделителем

Выберите количество строк, которые имеют определенное количество строк в соответствующей таблице

Как узнать, установлен ли SQL Server с экземпляром экземпляра по умолчанию или именованным экземпляром?

Оптимизация производительности запросов для динамически соединенных столбцов

SQL Server – поиск строки с международными символами с использованием предложения LIKE

Почему SQL Server Big Endian?

Создание нового SQL-соединения после создания базы данных на сервере

Более простой способ получить 1 ячейку из базы данных SQL Server

Создание xml из SQL Server 2008

Лучший способ хранения координат GPS в базе данных

Давайте будем гением компьютера.