T SQL Table Valued Function для разделения varbinary (max) на 16-байтные GUID

Я пытаюсь написать функцию, которая разделит поле varbinary (max) на таблицу с 16-байтовыми идентификаторами GUID, но я боюсь. Я не смог найти никаких примеров или пошаговых инструкций о том, как это сделать, используя varbinaries - так что любая помощь была оценена. Пример данных в поле varbinary, который я пытаюсь разбить, следующий:

0x09B57E7B1E19CD448698ECDA170B080F7C98FD411E5D264EB6D83AD6D4067C0D336E73299D2408438B625B09BED408D2D8E6C6DE4310194ABD90CF90F1558838731B2B740B508E44843FA98125ADF599669FC433BD4C074294C64E13D880A3ED78D25157C1E7A946B5B9C78E8DA0B5A8ECA73BB5CE59E6439586C445F25F2CDCA2B69483A7AE184A922DBC895C2EEB47910B88E915B7B94FB0EFC84568E2C83F0EF3168F62B6CB4EBA849486164F6DA7805C85383FBF694DB606904E0BA1364DC2DECDC1D00DED4BA28D0F1AA3DD9D1E1AA98697B914924995A26512C7EBD7C1

Спасибо

6 голосов | спросил Jim 6 22012vEurope/Moscow11bEurope/MoscowTue, 06 Nov 2012 03:56:31 +0400 2012, 03:56:31

2 ответа


9

Это легко, если у вас есть таблица чисел. Следующий пример разрезан и вставлен с сайта Эрланда Соммаргога:

CREATE FUNCTION fixbinary_single(@str varbinary(MAX))
RETURNS TABLE AS
RETURN(SELECT listpos = n.Number,
              n = convert(int, substring(@str, 4 * (n.Number - 1) + 1, 4))
       FROM   Numbers n
       WHERE  n.Number <= datalength(@str) / 4 )
ответил A-K 6 22012vEurope/Moscow11bEurope/MoscowTue, 06 Nov 2012 07:00:00 +0400 2012, 07:00:00
3

A рекурсивный подход к расщеплению идентификаторов GUID.

CREATE FUNCTION dbo.splitGUIDs(@guids varbinary(max))
returns table as return
with CTE(item, remainder) as (
select CAST(CAST(left(@guids, 16) as binary(16)) as uniqueidentifier), stuff(@guids, 1, 16, '')
where @guids > ''
union all
select CAST(CAST(left(remainder, 16) as binary(16)) as uniqueidentifier), stuff(remainder, 1, 16, '')
from cte
where remainder > ''
)
select item from cte
--option (maxrecursion 0);
GO

ПРИМЕЧАНИЕ , которое я поместил в функцию option(maxrecursion 0), но вам это нужно в вашем внешнем запросе, если ваш список содержит более 100 записей, например

SELECT item
  FROM dbo.splitGUIDS(@guids) x
OPTION (MAXRECURSION 0);

По сравнению с использованием таблицы Tally /Number

  • good: не зависит от такой таблицы
  • bad: может быть медленнее
  • good: нет встроенного верхнего предела элементов (размер таблицы Tally ограничивает количество элементов, извлеченных с использованием метода таблицы)
  • bad: вы должны помнить о том, чтобы использовать OPTION MAXRECURSION для больших списков в запросе caller
ответил 孔夫子 6 22012vEurope/Moscow11bEurope/MoscowTue, 06 Nov 2012 08:44:28 +0400 2012, 08:44:28

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132