Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Return table in one row.


Автор: NURMS 28.10.2008, 17:31
Народ привет.

Когда, к примеру, 
Код

SELECT Col_1 FROM Table_1
 возвращает таблицу, то можно ли как-нибудь содержимое талицы вернуть в одном ROW, т.е. конкатенацию всех ячеек табицы. Но не используя курсоров?

Добавлено через 12 минут и 54 секунды
Ах да, использовать это надо для инсерта.

Автор: comtat 29.10.2008, 00:02
можно 
Код
SELECT CAST(Col_1 as varchar) + ',' + CAST(Col_2 as varchar) + ... + CAST(Col_n as varchar)  FROM Table_1

только если значение поля может содержать NULL необходимо делать проверку ISNULL
также данный вариант не подойдет если есть поля типа TEXT

не лучше ли делать так 
Код

INSERT INTO Table_2 (Col_1, Col_2, ... , Col_n)  SELECT Col_1, Col_2, ... , Col_n FROM Table_1

Автор: boevik 30.10.2008, 08:56
Цитата(NURMS @ 28.10.2008,  17:31)
Народ привет.

Когда, к примеру, 
Код

SELECT Col_1 FROM Table_1
 возвращает таблицу, то можно ли как-нибудь содержимое талицы вернуть в одном ROW, т.е. конкатенацию всех ячеек табицы. Но не используя курсоров?

Если я правильно понял, то вместо нескольких записей с одним полем надо вернуть 1-у запись со всеми значениями col1?
Предлагаю такой вариант:
Код

create function dbo.col2row ()
returns varchar(1000)
as
begin
declare @lname varchar(100)
declare @lnames varchar(1000)
set @lnames = ''

DECLARE employees_cursor CURSOR FOR
SELECT lastname FROM Employees

OPEN employees_cursor

-- Perform the first fetch.
FETCH NEXT FROM employees_cursor INTO @lname

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
   set @lnames = @lnames + @lname + ', '
   -- This is executed as long as the previous fetch succeeds.
   FETCH NEXT FROM employees_cursor INTO @lname
END

CLOSE employees_cursor
DEALLOCATE employees_cursor

return @lnames 
end

Код


select dbo.col2row()

Автор: NURMS 30.10.2008, 15:44
Да, так тоже можно, но когда кол-во строк в таблице лимоны эти курсоры дико тормозят. К тому же можно просто так: 

Код

DECLARE @ReportText VARCHAR(MAX)
SET @ReportText = ''

SELECT @ReportText = @ReportText + Col_01
        FROM Table_01

...



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)