powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сцепить binary кляузой for xml path('')
12 сообщений из 12, страница 1 из 1
Сцепить binary кляузой for xml path('')
    #40031165
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сцеплять строки кляузой for xml path('') все умеют.
Код: sql
1.
2.
3.
with d as ( select s = N'строка1' union all select s = N'строка2' )
   select s as [text()] from d for xml path('')
;



А умеет ли кто делать то же самое с binary?
(через конвертацию в строку и обратно - неинтересно)
Код: sql
1.
2.
with d as ( select b = 0x123456 union all select b = 0x7890 )
   select b as [?????()] from d for xml path('')
...
Рейтинг: 0 / 0
Сцепить binary кляузой for xml path('')
    #40031168
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
with d as ( select b = 0x123456 union all select b = 0x7890 )
select t.b.value('.', 'varbinary(max)') 
   from (select b as [*] from d for xml path(''), type) t(b);
...
Рейтинг: 0 / 0
Сцепить binary кляузой for xml path('')
    #40031173
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем этот фикус объясняется?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
-- так - фсе хорошо
with d as ( select b = 0x123456 union all select b = 0x7890 )
   select (select b as [*] from d for xml path(''), type).value('.', 'varbinary(max)') ;
-- 0x1234567890

-- а так - не очень
with d as ( select b = 0x00123456 union all select b = 0x7890 )
   select (select b as [*] from d for xml path(''), type).value('.', 'varbinary(max)') ;
-- 0x00123456
...
Рейтинг: 0 / 0
Сцепить binary кляузой for xml path('')
    #40031181
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже обратил внимание, что varchar(max) склеивает, а varbinary(max) - нет.

P.S. Script Task, List.Add + String.Join
...
Рейтинг: 0 / 0
Сцепить binary кляузой for xml path('')
    #40031183
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
А чем этот фикус объясняется?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
-- так - фсе хорошо
with d as ( select b = 0x123456 union all select b = 0x7890 )
   select (select b as [*] from d for xml path(''), type).value('.', 'varbinary(max)') ;
-- 0x1234567890

-- а так - не очень
with d as ( select b = 0x00123456 union all select b = 0x7890 )
   select (select b as [*] from d for xml path(''), type).value('.', 'varbinary(max)') ;
-- 0x00123456



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
with d as ( select b = 0x123456 union all select b = 0x7890 )
   select (select b as [*] from d for xml path(''), type)
-- EjRWeJA=

-- а так - не очень
;with d as ( select b = 0x00123456 union all select b = 0x7890 )
   select (select b  as [*] from d for xml path(''), type)
-- ABI0Vg==eJA=


Гм...
...
Рейтинг: 0 / 0
Сцепить binary кляузой for xml path('')
    #40031185
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
А чем этот фикус объясняется?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
-- так - фсе хорошо
with d as ( select b = 0x123456 union all select b = 0x7890 )
   select (select b as [*] from d for xml path(''), type).value('.', 'varbinary(max)') ;
-- 0x1234567890

-- а так - не очень
with d as ( select b = 0x00123456 union all select b = 0x7890 )
   select (select b as [*] from d for xml path(''), type).value('.', 'varbinary(max)') ;
-- 0x00123456


Тем, что конкатенация двух base64 значений, в которые неявно преобразуется binary, в общем случае не даёт валидный base64:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
;with d as (
  select b = 0x123456 union all select b = 0x7890
), d1 as (
  select b = 0x00123456 union all select b = 0x7890
), e(x) as (
  select b as [*]
  from d
  for xml path(''), type
), e1(x) as (
  select b as [*]
  from d1
  for xml path(''), type
)
select * from e union all select * from e1


Код: plaintext
1.
2.
3.
x
------------
EjRWeJA=
ABI0Vg==eJA=
Код: powershell
1.
2.
3.
cls;
[System.Convert]::FromBase64String("EjRWeJA=") | oh;
[System.Convert]::FromBase64String("ABI0Vg==eJA=") | oh;


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
18
52
86
120
144
Исключение при вызове "FromBase64String" с "1" аргументами: "Входные данные не являются действительной строкой Base-64, поскольку содержат символ в кодировке, отличной о
т Base 64, больше двух символов заполнения или недопустимый символ среди символов заполнения. "
строка:3 знак:1
+ [System.Convert]::FromBase64String("ABI0Vg==eJA=") | oh;
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : FormatException
...
Рейтинг: 0 / 0
Сцепить binary кляузой for xml path('')
    #40031187
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны

Тем, что конкатенация двух base64 значений, в которые неявно преобразуется binary, в общем случае не даёт валидный base64

Гыгыгыгы!
Код: sql
1.
2.
;with d as ( select b = 0x00123456 union all select b = 0x7890 union all select b = 0x1111)
   select Convert(varbinary(max), (select Convert(varchar(max), b, 2)  as [*] from d for xml path('')), 2)
...
Рейтинг: 0 / 0
Сцепить binary кляузой for xml path('')
    #40031188
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
base64 значений, в которые неявно преобразуется binary
Господи, какая гадость! Никогда не любил работать с XML внутри СУБД, но лишняя причина тому не помешает.
...
Рейтинг: 0 / 0
Сцепить binary кляузой for xml path('')
    #40031189
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
Гыгыгыгы!

uaggster
Convert(varchar(max), b, 2)

aleks222
через конвертацию в строку и обратно - неинтересно
...
Рейтинг: 0 / 0
Сцепить binary кляузой for xml path('')
    #40031199
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,

Код: sql
1.
2.
with d as ( select b = 0x00123456 union all select b = 0x7890 )
   select t.x.value('xs:hexBinary(.)', 'varbinary(max)') from (select cast('' as xml).query('xs:hexBinary(sql:column("b"))') from d for xml path(''), type) t(x);
...
Рейтинг: 0 / 0
Сцепить binary кляузой for xml path('')
    #40031343
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
aleks222,

Код: sql
1.
2.
with d as ( select b = 0x00123456 union all select b = 0x7890 )
   select t.x.value('xs:hexBinary(.)', 'varbinary(max)') from (select cast('' as xml).query('xs:hexBinary(sql:column("b"))') from d for xml path(''), type) t(x);


Т.е. получается, как ни крути, все это через промежуточное неявное преобразование к строке и обратно.
...
Рейтинг: 0 / 0
Сцепить binary кляузой for xml path('')
    #40031349
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Т.е. получается, как ни крути, все это через промежуточное неявное преобразование к строке и обратно.
Именно.

Само-собой, можно еще так, но без гарантий
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @b varbinary(max) = 0x;

with d as ( select b = 0x00123456 union all select b = 0x7890 union all select 0x1122)
select
 @b += b
from
 d;

select @b;
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сцепить binary кляузой for xml path('')
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]