0

我写了一个函数,它返回一个带有单列的表,其中数据分隔为“|”。

例如,如果您将参数传递给函数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
4

2 回答 2

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

于 2012-09-07T11:09:33.107 回答
0

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

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

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

我知道这可能不是您所需要的,但我不确定您是否可以通过其他方式做您想做的事情。

希望它有点帮助

于 2012-09-07T11:09:09.700 回答