T-SQL有效地将5个逗号分隔的字符串解析为表

时间:2012-02-03 02:42:18

标签: arrays string tsql csv

我已经通过多种方式徘徊在一起,但需要以最高效的方式完成我的任务。

我正在编写一个程序,它从前端传递了5个变量。每个变量都是一个最多3118个逗号分隔元素的varchar。我需要将它们转换成表格并以高效的方式返回。

我找到了解析例程,旋转方法以及使用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 个答案:

答案 0 :(得分:2)

我会使用看起来像这样的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,您可以使用Table-Valued Parameter。我没有用过,所以我不能告诉你它是否表现得更好。

答案 1 :(得分:0)

您可以考虑调用一个程序集为您执行此解析。 这是一个tutorial,一些是documentation on MSDN,另一个是here