T-SQL эффективно анализирует 5 разделенных запятыми строк в таблицу - PullRequest
1 голос
/ 03 февраля 2012

Я пробежался по ряду способов объединить это, но мне нужен совет по наиболее эффективному способу выполнения моей задачи.

Я пишу процедуру, которая передала 5 переменных из внешнего интерфейса.,Каждая переменная представляет собой varchar, содержащий до 3118 элементов, разделенных запятыми.Мне нужно, чтобы они были преобразованы в таблицу и возвращены очень эффективным способом.

Я нашел процедуры синтаксического анализа, а также методы поворота и методы, которые используют CTE, временные таблицы и переменные таблиц.

Приведенный ниже пример является лишь иллюстрацией - в реальной жизни эти строки могут быть довольно длинными.Поэтому я надеюсь избежать длительных экспериментов и посмотреть, сможете ли вы, ребята, указать мне ЛУЧШИЙ способ справиться с этой задачей.

- * - начиная с этого:

declare @decimal varchar(50), @binary varchar(50), @primes varchar(50), @hex varchar(50), var5 varchar(50)

set @decimal = '1,2,3,4,5'
set @binary = '1,2,4,8,16'
set @primes = '1,2,3,5,7,11'
set @hex = '1','16','256','4096'
set @ancient = 'one','two','many' 

- создайте таблицу вывода, которая будет выглядеть следующим образом:

declare @results table (id int identity(1,1),  [integer] varchar(1), [binary] varchar(1), prime varchar(50), hex varchar(50), ancient varchar (50))

id  integer  binary  prime  hex    ancient
1   1        1       1      1      one
2   2        2       2      16     two
3   3        4       3      256    many
4   4        8       5      4096   null
5   5        16      7      null   null
6   null     null    11     null   null

- *

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

Я бы использовал параметр XML, который выглядит следующим образом.

<r>
  <i>1</i>
  <b>1</b>    
  <p>1</p>
  <h>1</h>
  <a>one</a>
</r>
<r>
  <i>2</i>
  <b>2</b>    
  <p>2</p>
  <h>16</h>
  <a>two</a>
</r>

И вставить в табличную переменную вот так.

insert into @results([integer], [binary], prime, hex, ancient)
select T.N.value('i[1]', 'varchar(1)'),
       T.N.value('b[1]', 'varchar(1)'),
       T.N.value('p[1]', 'varchar(50)'),
       T.N.value('h[1]', 'varchar(50)'),
       T.N.value('a[1]', 'varchar(50)')
from @xml.nodes('/r') as T(N)

По моему опыту, это достаточно эффективно. В SQL Server 2008 вы могли бы использовать Табличный параметр . Я не использовал это, поэтому я не могу сказать вам, если это работает лучше.

0 голосов
/ 03 февраля 2012

Возможно, вы могли бы подумать о том, чтобы вызвать сборку, выполняющую этот анализ для вас.Вот учебник , некоторая документация по MSDN и другой пример здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...