Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql SQL Server 2008初学者脚本问题:带子字符串和case语句的分隔字符串_Tsql_Sql Server 2008_Scripting - Fatal编程技术网

Tsql SQL Server 2008初学者脚本问题:带子字符串和case语句的分隔字符串

Tsql SQL Server 2008初学者脚本问题:带子字符串和case语句的分隔字符串,tsql,sql-server-2008,scripting,Tsql,Sql Server 2008,Scripting,我试图从一列中提取一个数据字符串,并将其拆分为几个不同的列。问题是我需要使用空格“”作为分隔符,但我不确定如何使用?此外,我需要合并我假设的案例陈述,以便在其他区域使用子字符串进行拆分 Eample:姓名账户445560010020056893010445478008 AFD 369 我可以使用空格作为分隔符,直到001002。。。数据字符串。那必须进一步分解。此外,如果我在使用多个空格的区域时使用空格作为分隔符,如何避免空列?这里有一个拆分表函数: CREATE FUNCTION [dbo].

我试图从一列中提取一个数据字符串,并将其拆分为几个不同的列。问题是我需要使用空格“”作为分隔符,但我不确定如何使用?此外,我需要合并我假设的案例陈述,以便在其他区域使用子字符串进行拆分

Eample:姓名账户445560010020056893010445478008 AFD 369
我可以使用空格作为分隔符,直到001002。。。数据字符串。那必须进一步分解。此外,如果我在使用多个空格的区域时使用空格作为分隔符,如何避免空列?

这里有一个拆分表函数:

CREATE FUNCTION [dbo].[Split]
(   
 @String varchar(max)
,@Delimiter char
)
RETURNS @Results table
(
 Ordinal int
,StringValue varchar(max)
)
as
begin

    set @String = isnull(@String,'')
    set @Delimiter = isnull(@Delimiter,'')

    declare
     @TempString varchar(max) = @String
    ,@Ordinal int = 0
    ,@CharIndex int = 0

    set @CharIndex = charindex(@Delimiter, @TempString)
    while @CharIndex != 0 begin     
        set @Ordinal += 1       
        insert @Results values
        (
         @Ordinal
        ,substring(@TempString, 0, @CharIndex)
        )       
        set @TempString = substring(@TempString, @CharIndex + 1, len(@TempString) - @CharIndex)     
        set @CharIndex = charindex(@Delimiter, @TempString)
    end

    if @TempString != '' begin
        set @Ordinal += 1 
        insert @Results values
        (
         @Ordinal
        ,@TempString
        )
    end

    return
end
用法:

select
s.*
from dbo.Split('445566          0010020056893010445478008 AFD 369', ' ') as s
where s.StringValue != '' -- this condition will drop your extra spaces
收益率:

Ordinal StringValue 1 445566 11 0010020056893010445478008 12 AFD 13 369
如果需要,您可以进一步细分。

太棒了!这太完美了。非常感谢。我怎样才能把这个函数拆分成行而不是一列呢?是的,我知道这是个问题。我知道所有的字符串都是120个字符,但它们的分解方式因字符串而异。该死的脑筋急转弯@antisanity和@gbn我想更好地处理T-Sql,你能给我推荐一本书吗?我有大约两年的Sql经验,但直到现在才开始接触Transact。你们显然经验丰富,你们的建议在我眼里比亚马逊评级更重要。谢谢英雄联盟事实上,我自己在java和C方面的背景有限。我的主管实际上也有同样的建议,他说他看的大部分书都是垃圾,我会在谷歌上搜索并在书堆上张贴问题。你们是专家,所以我一定会接受你们的建议。再次感谢!