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

Откуда: Київ
Сообщений: 10428
SQL2012.

Торможу не подеццки...

Хочу склеить значения поля t_text в nvarchar переменную.
Выборка --1 показывает все нужные записи, выборка --2 клеит в переменную только одно значение.

Объясните в чем ошибка:

declare @sx nvarchar(MAX)
set @sx=N'';

if NOT(object_id('tempdb..#temp_t') IS NULL) 
drop table #temp_t
CREATE   table #temp_t
(
	id uniqueidentifier NOT NULL,
	t_order int, 
	t_text nvarchar(MAX),
	int_id int
)
CREATE INDEX IX_temp_t1  ON #temp_t (int_id);

insert into #temp_t
(
	id, t_order,t_text,	int_id)
select
'EE531C56-4AFB-40A6-9D25-B964E1ECE900',	13,	N'  ** MONKEY 1',	1 union all select
'E7D4BB47-0928-4302-8FB9-C32E8F238AA4',	12,	N'	** MONKEY 2',	1 union all select
'FA789228-CE2E-4369-85DE-1B67BA74F07D',	11,	N'	** MONKEY 3',	1 union all select
'7626FD43-B661-476F-BE29-8C2AACD6D17C',	10,	N'	** MONKEY 4',	1 union all select
'7FE28B48-F114-4DBF-83D1-91BD9F6626FC',	9,	N'	** MONKEY 5',	1 union all select
'B2757D3E-4530-4D91-AF98-D673FECFAD6D',	8,	N'	** MONKEY 6',	1 union all select
'85BDFBEF-152E-4CC7-9BFF-0166C64A592E',	7,	N'	** MONKEY 7',	1 union all select
'33935814-067F-4082-B49F-99742E633229',	6,	N'	** MONKEY 8',	1 union all select
'65A6DEAA-EFBC-4D48-893F-98A6E6D20B85',	5,	N'	** MONKEY 9',	1 union all select
'0FF61897-3565-4CFF-9FFB-E09762DB4486',	4,	N'	** MONKEY 10',	1 union all select
'FDCA3A5C-6901-46F7-BCA4-14EBBAF9C432',	3,	N'	** MONKEY 11',	1 union all select
'0897E1E8-D84A-484F-8CF1-13223CF04796',	2,	N'	** MONKEY 12',	1 union all select
'8BA87FFE-345F-4969-B40D-FF03B68F2DC5',	1,	N'	** MONKEY 13',	1

-- 1
select * from #temp_t  where int_id=1 order by t_order

-- 2
select  @sx=@sx+N' '+ ISNULL(t_text, N' ')  from #temp_t where int_id=1 order by t_order

select @sx
29 окт 13, 15:23    [15047102]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Konst_One
Member

Откуда:
Сообщений: 11543
select  @sx=@sx+CONVERT(nvarchar(max),N' ')+CONVERT(nvarchar(max),ISNULL(t_text, N' '))  from #temp_t where int_id=1 order by t_order


а если так?
29 окт 13, 15:26    [15047128]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Winnipuh,

баян
29 окт 13, 15:28    [15047143]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Konst_One
select  @sx=@sx+CONVERT(nvarchar(max),N' ')+CONVERT(nvarchar(max),ISNULL(t_text, N' '))  from #temp_t where int_id=1 order by t_order


а если так?


так то же
-----------
** MONKEY 1


а вот так клеит, но все записи, а мне надо по конкретному int_id:

select  @sx=@sx+N' '+ ISNULL(t_text, N' ')  from #temp_t 
--where int_id=1 
order by t_order
29 окт 13, 15:31    [15047171]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость333
Winnipuh,

баян


да уж... б....

убрал ордер - сработало, но мне то ордер нужен....
29 окт 13, 15:32    [15047183]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Konst_One
Member

Откуда:
Сообщений: 11543
select  @sx=@sx+N' '+ ISNULL(T.t_text, N' ')  from (select t_text, t_order from #temp_t where int_id=1) T 
order by T.t_order


хм, может это?
29 окт 13, 15:34    [15047200]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость333
Winnipuh,

баян


кстати,

автор
Article ID: 287515 - Last Review: October 16, 2003 - Revision: 3.2
APPLIES TO
Microsoft SQL Server 2000 Standard Edition
Microsoft SQL Server 7.0 Standard Edition
Keywords:
kbcodesnippet kbprb KB287515



а у меня

Microsoft SQL Server 2012 (SP1) - 11.0.3368.0 (X64)
May 22 2013 17:10:44
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
29 окт 13, 15:34    [15047205]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Konst_One
select  @sx=@sx+N' '+ ISNULL(T.t_text, N' ')  from (select t_text, t_order from #temp_t where int_id=1) T 
order by T.t_order


хм, может это?


не, одна запись
-------------------
** MONKEY 1
29 окт 13, 15:36    [15047216]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
aleks2
Guest
declare @sx nvarchar(MAX)
set @sx=N'';

if NOT(object_id('tempdb..#temp_t') IS NULL) 
drop table #temp_t
CREATE   table #temp_t
(
	id uniqueidentifier NOT NULL,
	t_order int, 
	t_text nvarchar(MAX),
	int_id int
)
CREATE INDEX IX_temp_t1  ON #temp_t (int_id);

insert into #temp_t
(
	id, t_order,t_text,	int_id)
select
'EE531C56-4AFB-40A6-9D25-B964E1ECE900',	13,	N'  ** MONKEY 1',	1 union all select
'E7D4BB47-0928-4302-8FB9-C32E8F238AA4',	12,	N'	** MONKEY 2',	1 union all select
'FA789228-CE2E-4369-85DE-1B67BA74F07D',	11,	N'	** MONKEY 3',	1 union all select
'7626FD43-B661-476F-BE29-8C2AACD6D17C',	10,	N'	** MONKEY 4',	1 union all select
'7FE28B48-F114-4DBF-83D1-91BD9F6626FC',	9,	N'	** MONKEY 5',	1 union all select
'B2757D3E-4530-4D91-AF98-D673FECFAD6D',	8,	N'	** MONKEY 6',	1 union all select
'85BDFBEF-152E-4CC7-9BFF-0166C64A592E',	7,	N'	** MONKEY 7',	1 union all select
'33935814-067F-4082-B49F-99742E633229',	6,	N'	** MONKEY 8',	1 union all select
'65A6DEAA-EFBC-4D48-893F-98A6E6D20B85',	5,	N'	** MONKEY 9',	1 union all select
'0FF61897-3565-4CFF-9FFB-E09762DB4486',	4,	N'	** MONKEY 10',	1 union all select
'FDCA3A5C-6901-46F7-BCA4-14EBBAF9C432',	3,	N'	** MONKEY 11',	1 union all select
'0897E1E8-D84A-484F-8CF1-13223CF04796',	2,	N'	** MONKEY 12',	1 union all select
'8BA87FFE-345F-4969-B40D-FF03B68F2DC5',	1,	N'	** MONKEY 13',	1

-- 2
set @sx = (select  N' '+ ISNULL(t_text, N' ')  from #temp_t where int_id=1 order by t_order for xml path(''))

select @sx
29 окт 13, 15:36    [15047218]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Winnipuh
у меня Microsoft SQL Server 2012

Стало быть, принципы, изложенные в статье, не изменились :)
И, полагаю, не изменятся ещё очень долго.
29 окт 13, 15:38    [15047242]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
2 aleks2:
да, так проходит, но единственное надо desc. а то порядок обратный

s
et @sx = (select  N' '+ ISNULL(t_text, N' ')  from #temp_t where int_id=1 order by t_order [b]desc [/b]for xml path(''))


но все-таки осадок остался.... вынырнул эффект от 7 и 2000?
29 окт 13, 15:39    [15047251]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
aleks2
Guest
Winnipuh
2 aleks2:
да, так проходит, но единственное надо desc. а то порядок обратный

s
et @sx = (select  N' '+ ISNULL(t_text, N' ')  from #temp_t where int_id=1 order by t_order [b]desc [/b]for xml path(''))


но все-таки осадок остался.... вынырнул эффект от 7 и 2000?


1. Никогда MS не обещала работы
select  @sx=@sx+N' '+ ISNULL(t_text, N' ')  from #temp_t where int_id=1 order by t_order

И не обещает. Более того - предупреждает о неработе.

2. FOR XML будет работать всегда.
29 окт 13, 15:46    [15047313]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
aleks2
Winnipuh
2 aleks2:
да, так проходит, но единственное надо desc. а то порядок обратный

s
et @sx = (select  N' '+ ISNULL(t_text, N' ')  from #temp_t where int_id=1 order by t_order [b]desc [/b]for xml path(''))


но все-таки осадок остался.... вынырнул эффект от 7 и 2000?


1. Никогда MS не обещала работы
select  @sx=@sx+N' '+ ISNULL(t_text, N' ')  from #temp_t where int_id=1 order by t_order

И не обещает. Более того - предупреждает о неработе.

2. FOR XML будет работать всегда.



да, по поводу не обещали согласен...

кстати, подскажиет как мне прицепить в конце каждого поля перевод строки ?
CHAR(13) + CHAR(10)

в случае с xml это не перевод строки, а коды символов получаются в результате
** MONKEY
29 окт 13, 15:55    [15047391]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Winnipuh
коды символов получаются в результате

Нужно небольшое допиливание:
set @sx = (select  N' '+ ISNULL(t_text, N' ')  from #temp_t where int_id=1 order by t_order desc for xml path(''), type).value('.', 'nvarchar(max)')
29 окт 13, 15:57    [15047412]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость333
Winnipuh
коды символов получаются в результате

Нужно небольшое допиливание:
set @sx = (select  N' '+ ISNULL(t_text, N' ')  from #temp_t where int_id=1 order by t_order desc for xml path(''), type).value('.', 'nvarchar(max)')


спасибо!
29 окт 13, 16:03    [15047473]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
aleks2
Guest
Гость333
Winnipuh
коды символов получаются в результате

Нужно небольшое допиливание:
set @sx = (select  N' '+ ISNULL(t_text, N' ')  from #temp_t where int_id=1 order by t_order desc for xml path(''), type).value('.', 'nvarchar(max)')


Не проканает.
Я недавно боролся.
Только REPLACE спасет.
29 окт 13, 16:06    [15047499]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
aleks2
Гость333
пропущено...

Нужно небольшое допиливание:
set @sx = (select  N' '+ ISNULL(t_text, N' ')  from #temp_t where int_id=1 order by t_order desc for xml path(''), type).value('.', 'nvarchar(max)')


Не проканает.
Я недавно боролся.
Только REPLACE спасет.


а подробнее можно, как бороться в данном случае?
29 окт 13, 16:17    [15047582]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5986
aleks2
Не проканает.
Я недавно боролся.
Только REPLACE спасет.

А пример можно?
Вот такое (например)
select v.x.value('.','nvarchar(max)') from (
  select '<>&'+char(13)+'|' for xml path(''), type
) v(x)

прекрасно работает даже на 2005-м сервере:
-----------------------
<>&
|

(1 row(s) affected)

- без type было бы
&lt;&gt;&amp;&#x0D;|
29 окт 13, 16:20    [15047608]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Сон Веры Павловны
aleks2
Не проканает.
Я недавно боролся.
Только REPLACE спасет.

А пример можно?
Вот такое (например)
select v.x.value('.','nvarchar(max)') from (
  select '<>&'+char(13)+'|' for xml path(''), type
) v(x)

прекрасно работает даже на 2005-м сервере:
-----------------------
<>&
|

(1 row(s) affected)

- без type было бы
&lt;&gt;&amp;&#x0D;|


вот у меня без type так и показывалась строка, внутри где расставил перевод строки были такие коды.
29 окт 13, 16:21    [15047619]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
user89
Member

Откуда:
Сообщений: 2083
Сон Веры Павловны
А пример можно?
Любой char меньше 9
select v.x.value('.','nvarchar(max)') from (
  select '<>&'+char(8)+'|' for xml path(''), type
) v(x)
29 окт 13, 17:08    [15047990]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5986
user89
Любой char меньше 9
select v.x.value('.','nvarchar(max)') from (
  select '<>&'+char(8)+'|' for xml path(''), type
) v(x)

А вы сами такое пытались запускать на выполнение? У меня сервер 2008 R2 SP1 (10.50.2500) и сервер 2005 (9.00.5057) - оба выдают, что
Msg 6841, Level 16, State 1, Line 1
FOR XML could not serialize the data for node 'NoName' because it contains a character (0x0008) which is not allowed in XML. To retrieve this data using FOR XML, convert it to binary, varbinary or image data type and use the BINARY BASE64 directive.

Так что такой пример некорректен. Насколько я понял выше из постинга aleks2 , for xml type у него вполне отрабатывает, но не получается избавиться от entities.
30 окт 13, 06:24    [15050131]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
user89
Member

Откуда:
Сообщений: 2083
Сон Веры Павловны
А вы сами такое пытались запускать на выполнение?
Да. Поэтому и привел пример. Чтобы for xml корректно отработал, надо сначала сделать replace(char<9).
Но у меня такой случай был один раз, данные были из внешнего источника. Возможно есть еще символы, которые for xml не проглотит...
30 окт 13, 10:21    [15050738]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
user89
сделать replace(char<9).

Можно пример? На что именно нужно заменить?
30 окт 13, 10:23    [15050751]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
user89
Member

Откуда:
Сообщений: 2083
Гость333,

declare @t table (txt varchar(max))
insert @t values ('abc' + char(1)), ('&<>' + char(2))
select * from @t

-- Работает
select stuff((select ', ' + replace(replace(txt,char(1),''), char(2),'') from @t for xml path(''),type).value('text()[1]','varchar(max)'), 1,2,'')

-- Ошибка
select (select txt from @t for xml path(''),type).value('text()[1]','NVarChar(max)')
30 окт 13, 11:01    [15051103]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
user89,

Ну то есть вы конкатенируете не оригинальные строки, а строки с выкинутыми "неугодными" символами.
Думаю, это какой-то не такой replace, о котором говорил aleks2.
30 окт 13, 11:22    [15051314]     Ответить | Цитировать Сообщить модератору
 Re: Склеить значения поля в выборке в одну VARCHAR: где ошибка?  [new]
user89
Member

Откуда:
Сообщений: 2083
Гость333,

наверное, да. В общем, ждем информации от aleks2 ...
30 окт 13, 11:33    [15051398]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft SQL Server Ответить