Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Почти траспонирование, но не PIVOT  [new]
Диам
Member

Откуда:
Сообщений: 1441
Здравствуйте.
Подскажите, как имея текстовую переменную такого вида:
@txt nvarchar(2500)
@txt = '234, 2345, 5467, 6578, 7890, 890, 23456, 788,' (числа через запятую идут)

Получить результат в виде таблицы с одним столбцом, неважно как называющимся и чтобы эти числа были в строках?

Я на сервер хочу в процедуре передавать вот такую строку, и надо, чтобы эти числа записались в нужную табличку. Формировать на клиенте энное количество запросов 'INSERT INTO ... VALUES(...)' как-то некошерно...
28 окт 13, 13:04    [15040728]     Ответить | Цитировать Сообщить модератору
 Re: Почти траспонирование, но не PIVOT  [new]
Glory
Member

Откуда:
Сообщений: 104760
Диам
Формировать на клиенте энное количество запросов 'INSERT INTO ... VALUES(...)' как-то некошерно...

А на сервере кошерно будет ?
28 окт 13, 13:07    [15040744]     Ответить | Цитировать Сообщить модератору
 Re: Почти траспонирование, но не PIVOT  [new]
Диам
Member

Откуда:
Сообщений: 1441
Glory,
ну.... будет конечно быстрее :)
Есть способ сделать замену разделителя текстом ' INSERT INTO Tab_(Fld) VALUES('

Но нет ли способа поизящнее?
28 окт 13, 13:17    [15040818]     Ответить | Цитировать Сообщить модератору
 Re: Почти траспонирование, но не PIVOT  [new]
Диам
Member

Откуда:
Сообщений: 1441
сорри, описка. Не VALUES, а SELECT
28 окт 13, 13:18    [15040826]     Ответить | Цитировать Сообщить модератору
 Re: Почти траспонирование, но не PIVOT  [new]
Glory
Member

Откуда:
Сообщений: 104760
Диам
ну.... будет конечно быстрее :)

Вы уверены ?
Диам
Но нет ли способа поизящнее?

В смысле поизящнее ? Одной вошебной командой превратить текст с разделителями в таблицу не получится.
Прикется писать код. Или искать уже написанный.
28 окт 13, 13:19    [15040830]     Ответить | Цитировать Сообщить модератору
 Re: Почти траспонирование, но не PIVOT  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Для версий >= 2008
INSERT INTO Tab(Fld) VALUES (234), (2345), (5467), (6578), (7890), (890), (23456), (788)
28 окт 13, 13:22    [15040849]     Ответить | Цитировать Сообщить модератору
 Re: Почти траспонирование, но не PIVOT  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
CREATE FUNCTION [dbo].[fnSplit](@list ntext, @delimiter nvarchar(20) = N',')
         RETURNS @tbl TABLE (id int identity(1, 1) primary key, value nvarchar(4000))
AS
begin
declare	@pos		int,
		@bufStart	int,
		@chunkLen	smallint,
		@buf		nvarchar(4000),
		@leftOver	nvarchar(4000),
		@delimLen	int

	set @delimLen = datalength(@delimiter)/2;
	set @bufStart = 1;
	set @leftOver = '';
	
	while @bufStart <= datalength(@list) / 2
	begin
		set @chunkLen = 4000 - datalength(@leftOver) / 2;
		set @buf = @leftOver + substring(@list, @bufStart, @chunkLen);
		set @bufStart = @bufStart + @chunkLen;

         set @pos = charindex(@delimiter, @buf);

         while @pos > 0
         begin
            insert @tbl (value) values (left(@buf, @pos - 1))
            set @buf = substring(@buf, @pos + @delimLen, datalength(@buf));
            set @pos = charindex(@delimiter, @buf);
         end

		if @chunkLen = 0
		begin
			-- Значение длиннее 4000
            insert @tbl (value) values (@buf)
			set @buf = '';
		end
		set @leftOver = @buf;
	end

	insert @tbl(value) values (@leftOver)

	return
end
GO



declare @txt nvarchar(2500)
set @txt = '234, 2345, 5467, 6578, 7890, 890, 23456, 788'


select * from dbo.fnSplit(@txt, ', ')
28 окт 13, 13:22    [15040850]     Ответить | Цитировать Сообщить модератору
 Re: Почти траспонирование, но не PIVOT  [new]
Диам
Member

Откуда:
Сообщений: 1441
Гость333
Для версий >= 2008
INSERT INTO Tab(Fld) VALUES (234), (2345), (5467), (6578), (7890), (890), (23456), (788)


Спасибо. Вот это изящно. А я уже начал было писать

	
        declare @t nvarchar(2500)
	SET @t='INSERT INTO T_DB(TNom) SELECT('''
	SET @tel=REPLACE(@tel,',',''') UNION SELECT(''')
	SET @tel=@tel + ''')'
	SET @t=@t+@tel
		
	exec (@t)
28 окт 13, 13:47    [15041061]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить