如何在存储过程中使用Split函数?

时间:2012-08-31 05:21:58

标签: asp.net stored-procedures split

我选择的值如下:

select browser, firstname, lastname from details

这里的浏览器值如下:

33243@Firefox@dsfsd
34234@google@dfsd

另外我单独使用了分割函数,如下所示:

select * from dbo.split('33243@Firefox@dsfsd','@')

结果是:

items
===========
33243
firefox
dsfsd

所以我使用了如下的分割功能

select split(browser, '@'), firstname, lastname from details

但它不起作用......

我需要的是

33243 @火狐@ dsfsd

而不是将这样的值显示到网格中, 必须只显示Firefox到网格中。

4 个答案:

答案 0 :(得分:1)

既然你知道每次都想要第二个元素,你可以写一个这样的函数:


CREATE FUNCTION [dbo].[fn_SplitElement] 
(
    @inputString nvarchar(2000),    --The input string
    @elem   int,    --The 1-based element index to return,
    @delimiter nvarchar(1)  --The delimiter char
)
RETURNS nvarchar(2000)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @result nvarchar(2000)

    -- Add the T-SQL statements to compute the return value here
    SELECT @result = value
    FROM
    (
        SELECT *,ROW_NUMBER() OVER(ORDER By Position) as rownum FROM dbo.split(@inputString,@delimiter)
    ) as t
    WHERE rownum=@elem

    -- Return the result of the function
    RETURN @result

END

GO

然后你可以打电话:


select [dbo].[fn_SplitElement](browser,2,'@') as 'BrowserName', firstname, lastname from details

答案 1 :(得分:0)

您没有说明您正在使用哪个版本的SQL Server或哪个拆分功能。但是,大多数split函数返回一个表而不是行,因此您需要使用JOIN来连接两个表(第一个是拆分,第二个是其余字段)。

有关SQL分割函数的更多信息,请参阅http://www.sommarskog.se/arrays-in-sql.html的Erland Sommarskog页面。

答案 2 :(得分:0)

您可以创建一个分割功能,并在需要时使用。

CREATE FUNCTION [dbo].[Split]
(   
    @List nvarchar(max),
    @SplitOn nvarchar(1)
)
RETURNS @RtnValue table (
    Id int identity(1,1),
    Value nvarchar(max)
)
AS
BEGIN
    While (Charindex(@SplitOn,@List)>0)
    Begin 
        Insert Into @RtnValue (value)
        Select 
            Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1))) 
        Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
    End 

    Insert Into @RtnValue (Value)
    Select Value = ltrim(rtrim(@List))

    Return
END

之后,您可以在查询中调用该函数,如下所示。

SELECT * FROM anotherTable WHERE user_id IN(dbo.split(@user_list,','))

答案 3 :(得分:0)

我使用了以下查询而不是使用拆分功能..它工作得很好..

 select 
        SUBSTRING(SUBSTRING(browser, CHARINDEX ('@', browser)+1,LEN(browser)-charindex('@', browser)),
        0,
        CHARINDEX('@',SUBSTRING(browser, CHARINDEX ('@', browser)+1,LEN(browser)-CHARINDEX('@', browser)))),
    firstname, lastname from details
相关问题