管道分隔格式的数据插入表中

时间:2012-09-07 11:01:22

标签: sql sql-server function

我编写了一个函数,该函数返回一个包含单列的表,数据分隔为“|”。

如果将参数传递给函数funsplit('SAGAR|INDIA|MUMBAI','|')

,则为示例

它返回

Item<Column Name>
SAGAR
INDIA
MUMBAI

我希望它为

COLUMN 1   COLUMN2    COLUMN3
-----------------------------
SAGAR      INDIA      MUMBAI

这是我的功能

ALTER FUNCTION [dbo].[funSplit]
(
    @sInputList Varchar(8000), -- List of delimited items  
    @sDelimiter VarChar(8000) = ',' -- delimiter that separates items  
)
Returns @List Table (item VarChar(8000))  
Begin  
 Declare @sItem VarChar(8000)  

 While CharIndex(@sDelimiter,@sInputList,0) <> 0  
  Begin  
   Select   
   @sItem=RTrim(LTrim(SubString(@sInputList,1,CharIndex(@sDelimiter,@sInputList,0)-1))),  
   @sInputList=RTrim(LTrim(SubString(@sInputList,CharIndex(@sDelimiter,@sInputList,0)+Len(@sDelimiter),Len(@sInputList))))  

   If Len(@sItem) > 0  
    Insert Into @List Select @sItem  
 End  

 If Len(@sInputList) > 0  
  Insert Into @List Select @sInputList -- Put the last item in  

 Return  
End

2 个答案:

答案 0 :(得分:1)

这将转换您的结果。

select *
from
(
 SELECT Row_Number() over(order by Item) rn,  Item 
 from dbo.funsplit('SAGAR|INDIA|MUMBAI','|')
) src
PIVOT 
(Max(Item) for rn in ([1],[2],[3])) p

如果订单对您很重要,您需要从函数

返回该订单

如果列是可变的,那么您可以使用动态SQL创建上述内容并使用sp_executesql

答案 1 :(得分:0)

你的@List变量应该是一个包含多列的表,比如

DECLARE @List TABLE(col1 varchar(8000),col2 varchar(8000),col3 varchar(8000))

因此,您需要提前知道字符串部分的数量。

我知道这可能不是你所需要的,但我不确定,如果你能以任何其他方式做你想做的事。

希望它有所帮助