zoukankan      html  css  js  c++  java
  • SQL字符串处理按分割符拆分字符串TSQL to Split a varchar into Words

      1 ---去掉字符串分隔符
      2 
      3 CREATE TABLE inventory (fullname varchar(60NOT NULL)
      4 go
      5 INSERT inventory(fullname)
      6 VALUES ('2004 Inventory:Ex.Plant Farm1:1st Cut:Premium:0094')
      7 INSERT inventory(fullname)
      8 VALUES ('2004 Inventory')
      9 INSERT inventory(fullname)
     10 VALUES ('2004 Inventory:Ex.Plant Farm1:1st Cut')
     11 go
     12 
     13 SELECT inventory, plant = nullif(plant, ''), cut = nullif(cut, ''),
     14 grade = nullif(grade, ''), lot# = nullif(lot#, '')
     15 FROM
     16 (SELECT inventory, plant, cut,
     17 left(rest, charindex(':', rest + ':'- 1AS grade,
     18 substring(rest, charindex(':', rest + ':'+ 1,
     19 len(rest)) AS lot#
     20 FROM
     21 (SELECT inventory, plant,
     22 left(rest, charindex(':', rest + ':'- 1AS cut,
     23 substring(rest, charindex(':', rest + ':'+ 1,
     24 len(rest)) AS rest
     25 FROM
     26 (SELECT inventory,
     27 left(rest, charindex(':', rest + ':'- 1AS plant,
     28 substring(rest, charindex(':', rest + ':'+ 1,
     29 len(rest)) AS rest
     30 FROM
     31 (SELECT left(fullname, charindex(':', fullname + ':'- 1AS inventory,
     32 substring(fullname, charindex(':', fullname + ':'+ 1,
     33 len(fullname)) AS rest
     34 FROM inventory) AS a) AS b) AS c) AS d
     35 go
     36 
     37 DROP TABLE inventory
     38 
     39 --Below is a UDF to take a comma delim value and return in table format,
     40 --the split results.. Use like select * from dbo.Split('1,2,3,3',',')
     41 CREATE FUNCTION dbo.Split(@sText varchar(8000), @sDelim varchar(20= '')
     42 RETURNS @retArray TABLE (idx smallint Primary Key, value varchar(8000))
     43 AS
     44 BEGIN
     45 DECLARE @idx int,
     46 @value varchar(8000),
     47 @bcontinue bit,
     48 @iStrike int,
     49 @iDelimlength int
     50 
     51 IF @sDelim = 'Space'
     52 BEGIN
     53 SET @sDelim = ' '
     54 END
     55 
     56 SET @idx = 0
     57 SET @sText = LTrim(RTrim(@sText))
     58 SET @iDelimlength = DATALENGTH(@sDelim)
     59 SET @bcontinue = 1
     60 
     61 if(Len(@sText= 0)
     62 return
     63 
     64 IF NOT ((@iDelimlength = 0or (@sDelim = 'Empty'))
     65 BEGIN
     66 WHILE @bcontinue = 1
     67 BEGIN
     68 
     69 --If you can find the delimiter in the text, retrieve the first element
     70 and
     71 --insert it with its index into the return table.
     72 
     73 IF CHARINDEX(@sDelim@sText)>0
     74 BEGIN
     75 SET @value = SUBSTRING(@sText,1CHARINDEX(@sDelim,@sText)-1)
     76 BEGIN
     77 INSERT @retArray (idx, value)
     78 VALUES (@idx@value)
     79 END
     80 
     81 --Trim the element and its delimiter from the front of the string.
     82 --Increment the index and loop.
     83 SET @iStrike = DATALENGTH(@value+ @iDelimlength
     84 SET @idx = @idx + 1
     85 SET @sText = LTrim(Right(@sText,DATALENGTH(@sText- @iStrike))
     86 
     87 END
     88 ELSE
     89 BEGIN
     90 --If you canÆt find the delimiter in the text, @sText is the last
     91 value in
     92 --@retArray.
     93 SET @value = @sText
     94 BEGIN
     95 INSERT @retArray (idx, value)
     96 VALUES (@idx@value)
     97 END
     98 --Exit the WHILE loop.
     99 SET @bcontinue = 0
    100 END
    101 END
    102 END
    103 ELSE
    104 BEGIN
    105 WHILE @bcontinue=1
    106 BEGIN
    107 --If the delimiter is an empty string, check for remaining text
    108 --instead of a delimiter. Insert the first character into the
    109 --retArray table. Trim the character from the front of the string.
    110 --Increment the index and loop.
    111 IF DATALENGTH(@sText)>1
    112 BEGIN
    113 SET @value = SUBSTRING(@sText,1,1)
    114 BEGIN
    115 INSERT @retArray (idx, value)
    116 VALUES (@idx@value)
    117 END
    118 SET @idx = @idx+1
    119 SET @sText = SUBSTRING(@sText,2,DATALENGTH(@sText)-1)
    120 
    121 END
    122 ELSE
    123 BEGIN
    124 --One character remains.
    125 --Insert the character, and exit the WHILE loop.
    126 INSERT @retArray (idx, value)
    127 VALUES (@idx@sText)
    128 SET @bcontinue = 0
    129 END
    130 END
    131 
    132 END
    133 
    134 RETURN
    135 END
    136 
    137 GO
    138 
    139 SET QUOTED_IDENTIFIER OFF
    140 GO
    141 SET ANSI_NULLS ON
    142 GO
    143 
    144 
    145 
    146 ---Here is an example usage of the T-SQL SPLIT function in action
    147 CREATE FUNCTION SPLIT
    148 (
    149   @s nvarchar(max),
    150   @trimPieces bit,
    151   @returnEmptyStrings bit
    152 )
    153 returns @t table (val nvarchar(max))
    154 as
    155 begin
    156 
    157 declare @i int@j int
    158 select @i = 0@j = (len(@s- len(replace(@s,',','')))
    159 
    160 ;with cte
    161 as
    162 (
    163   select
    164     i = @i + 1,
    165     s = @s,
    166     n = substring(@s0charindex(','@s)),
    167     m = substring(@scharindex(','@s)+1len(@s- charindex(','@s))
    168 
    169   union all
    170 
    171   select
    172     i = cte.i + 1,
    173     s = cte.m,
    174     n = substring(cte.m, 0charindex(',', cte.m)),
    175     m = substring(
    176       cte.m,
    177       charindex(',', cte.m) + 1,
    178       len(cte.m)-charindex(',', cte.m)
    179     )
    180   from cte
    181   where i <= @j
    182 )
    183 insert into @t (val)
    184 select pieces
    185 from
    186 (
    187   select
    188   case
    189     when @trimPieces = 1
    190     then ltrim(rtrim(case when i <= @j then n else m end))
    191     else case when i <= @j then n else m end
    192   end as pieces
    193   from cte
    194 ) t
    195 where
    196   (@returnEmptyStrings = 0 and len(pieces) > 0)
    197   or (@returnEmptyStrings = 1)
    198 option (maxrecursion 0)
    199 
    200 return
    201 
    202 end
    203 
    204 GO
    205 --测试
    206 declare @s nvarchar(max)
    207 select @s = N',,45 , 1, 56, 346 456,8,5, ,d,1,4, 5 9 ,t,,4,5 ,,, w, 3,,'
    208 select * from dbo.split(@s,1,0)
    209 
    210 
    211 ---
    212 DECLARE @t table(c1 varchar(200))
    213 INSERT INTO @t (c1) VALUES('LongerValue/Place_1/Last_Place')
    214 
    215 SELECT site = PARSENAME(REPLACE(c1, '/''.'), 3),
    216 floor = PARSENAME(REPLACE(c1, '/''.'), 2),
    217 location = PARSENAME(REPLACE(c1, '/''.'), 1)
    218 FROM @t
    219 
    220 
    221 CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
    222 RETURNS table
    223 AS
    224 RETURN (
    225     WITH Pieces(pn, start, stop) AS (
    226       SELECT 11CHARINDEX(@sep@s)
    227       UNION ALL
    228       SELECT pn + 1, stop + 1CHARINDEX(@sep@s, stop + 1)
    229       FROM Pieces
    230       WHERE stop > 0
    231     )
    232     SELECT pn,
    233       SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 ENDAS s
    234     FROM Pieces
    235   )
    236 
    237 
    238 --I use this function (SQL Server 2005 and above).
    239 create function [dbo].[Split]
    240 (
    241     @string nvarchar(4000),
    242     @delimiter nvarchar(10)
    243 )
    244 returns @table table
    245 (
    246     [Value] nvarchar(4000)
    247 )
    248 begin
    249     declare @nextString nvarchar(4000)
    250     declare @pos int@nextPos int
    251     declare @commaCheck nvarchar(1)
    252 
    253     set @nextString = ''
    254     set @commaCheck = right(@string1)
    255     set @string = @string + @delimiter
    256 
    257     set @pos = charindex(@delimiter@string)
    258     set @nextPos = 1
    259     while (@pos <> 0)
    260     begin
    261         set @nextString = substring(@string1@pos - 1)
    262 
    263         insert into @table
    264         (
    265                 [Value]
    266         )
    267         values
    268         (
    269                 @nextString
    270         )
    271 
    272         set @string = substring(@string@pos + 1len(@string))
    273         set @nextPos = @pos
    274         set @pos = charindex(@delimiter@string)
    275     end
    276     return
    277 end
    278 
    279 --
    280 create FUNCTION dbo.fn_Split2 (@sep nvarchar(10), @s nvarchar(4000))
    281 RETURNS table
    282 AS
    283 RETURN (
    284     WITH Pieces(pn, start, stop) AS (
    285       SELECT 11CHARINDEX(@sep@s)
    286       UNION ALL
    287       SELECT pn + 1, stop + (datalength(@sep)/2), CHARINDEX(@sep@s, stop + (datalength(@sep)/2))
    288       FROM Pieces
    289       WHERE stop > 0
    290     )
    291     SELECT pn,
    292       SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 4000 ENDAS s
    293     FROM Pieces
    294   )
    295 --
    296 ALTER Function [dbo].[SplitStr] ( 
    297         @txt text 
    298 
    299 Returns @tmp Table 
    300         ( 
    301                 value varchar(127)
    302         ) 
    303 as 
    304 BEGIN 
    305         declare @str varchar(8000
    306                 , @Beg int 
    307                 , @last int 
    308                 , @size int 
    309 
    310         set @size=datalength(@txt
    311         set @Beg=1 
    312 
    313 
    314         set @str=substring(@txt,@Beg,8000
    315         IF len(@str)<8000 set @Beg=@size 
    316         ELSE BEGIN 
    317                 set @last=charindex(','reverse(@str)) 
    318                 set @str=substring(@txt,@Beg,8000-@last
    319                 set @Beg=@Beg+8000-@last+1 
    320         END 
    321 
    322         declare @workingString varchar(25
    323                 , @stringindex int 
    324 
    325 
    326 
    327         while @Beg<=@size Begin 
    328                 WHILE LEN(@str> 0 BEGIN 
    329                         SELECT @StringIndex = CHARINDEX(','@str
    330 
    331                         SELECT 
    332                                 @workingString = CASE 
    333                                         WHEN @StringIndex > 0 THEN SUBSTRING(@str1@StringIndex-1
    334                                         ELSE @str 
    335                                 END 
    336 
    337                         INSERT INTO 
    338                                 @tmp(value)
    339                         VALUES 
    340                                 (cast(rtrim(ltrim(@workingString)) as varchar(127)))
    341                         SELECT @str = CASE 
    342                                 WHEN CHARINDEX(','@str> 0 THEN SUBSTRING(@str@StringIndex+1LEN(@str)) 
    343                                 ELSE '' 
    344                         END 
    345                 END 
    346                 set @str=substring(@txt,@Beg,8000
    347 
    348                 if @Beg=@size set @Beg=@Beg+1 
    349                 else IF len(@str)<8000 set @Beg=@size 
    350                 ELSE BEGIN 
    351                         set @last=charindex(','reverse(@str)) 
    352                         set @str=substring(@txt,@Beg,8000-@last
    353                         set @Beg=@Beg+8000-@last+1 
    354 
    355                 END 
    356         END     
    357 
    358         return
    359 END
    360 --
    361 SELECT substring(commaSeparatedTags,0,charindex(',',commaSeparatedTags))
    362 
    363 --
    364 CREATE FUNCTION SplitWords(@text varchar(8000))
    365    RETURNS @words TABLE (
    366       pos smallint primary key,
    367       value varchar(8000)
    368    )
    369 AS
    370 BEGIN
    371    DECLARE
    372       @pos smallint,
    373       @i smallint,
    374       @j smallint,
    375       @s varchar(8000)
    376 
    377    SET @pos = 1
    378    WHILE @pos <= LEN(@text
    379    BEGIN 
    380       SET @i = CHARINDEX(' '@text@pos)
    381       SET @j = CHARINDEX(','@text@pos)
    382       IF @i > 0 OR @j > 0
    383       BEGIN
    384          IF @i = 0 OR (@j > 0 AND @j < @i)
    385             SET @i = @j
    386 
    387          IF @i > @pos
    388          BEGIN
    389             -- @i now holds the earliest delimiter in the string
    390             SET @s = SUBSTRING(@text@pos@i - @pos)
    391 
    392             INSERT INTO @words
    393             VALUES (@pos@s)
    394          END 
    395          SET @pos = @i + 1
    396 
    397          WHILE @pos < LEN(@text
    398             AND SUBSTRING(@text@pos1IN (' '',')
    399             SET @pos = @pos + 1 
    400       END 
    401       ELSE 
    402       BEGIN 
    403          INSERT INTO @words 
    404          VALUES (@posSUBSTRING(@text@posLEN(@text- @pos + 1))
    405 
    406          SET @pos = LEN(@text+ 1 
    407       END 
    408    END 
    409    RETURN 
    410 END
    411 
    412 
    413 select *
    414 
    415 from table1 t1
    416 
    417 where dbo.splitwords(t1.column1)
    418 
    419    like dbo.splitwords(@userinput)
    420 
    421 (where @userinput is a input parameter)
    422 
    423 --I think dbo.splitwords(t1.column1) does not work in sql server 2000.
    424 
    425 --I hope you have solution. 
    426 
    427 --Sample table.
    428 CREATE TABLE dbo.[tblRates] (
    429 [RateID] [id]  ,
    430 [Rate] [varchar] (80) COLLATE Latin1_General_CI_AS NULL
    431 )
    432 GO
    433 
    434 --Sample data.
    435 CREATE TABLE tblRates
    436 (
    437 RateID INT,
    438 Rate VARCHAR(100)
    439 )
    440 GO
    441 
    442 INSERT INTO tblRates (RateID, Rate)
    443 VALUES (1,'1.123456789,2.1234567,3.12345')
    444 
    445 
    446 --Current query, with the three rates split out (Fields: Rate1,Rate2,Rate3)
    447 SELECT
    448 Rate AS 'MasterRates'
    449 ,'Rate1' = LEFT(Rate,CHARINDEX(',',Rate)-1)
    450 ,'Rate2' =
    451 LEFT(SUBSTRING(Rate,(CHARINDEX(',',Rate)+1),LEN(Rate)),CHARINDEX(',',SUBSTRING(Rate,(CHARINDEX(',',Rate)+1),LEN(Rate)))-1)
    452 ,'Rate3' = SUBSTRING(Rate, ((LEN(LEFT(Rate,CHARINDEX(',',Rate)-1))+1+
    453 (LEN(LEFT(SUBSTRING(Rate,(CHARINDEX(',',Rate)+1),LEN(Rate)),CHARINDEX(',',SUBSTRING(Rate,(CHARINDEX(',',Rate)+1),LEN(Rate)))-1))+1))+1
    454 ,LEN(Rate) )
    455 
    456 --Fields for calculation reference.
    457 ,'Rate1LengthIncDelimitter' = LEN(LEFT(Rate,CHARINDEX(',',Rate)-1))+1
    458 ,'Rate2LengthIncDelimitter' =
    459 LEN(LEFT(SUBSTRING(Rate,(CHARINDEX(',',Rate)+1),LEN(Rate)),CHARINDEX(',',SUBSTRING(Rate,(CHARINDEX(',',Rate)+1),LEN(Rate)))-1))+1
    460 ,'Rate3StartingCharacterPostion' =
    461 ((LEN(LEFT(Rate,CHARINDEX(',',Rate)-1))+1+
    462 (LEN(LEFT(SUBSTRING(Rate,(CHARINDEX(',',Rate)+1),LEN(Rate)),CHARINDEX(',',SUBSTRING(Rate,(CHARINDEX(',',Rate)+1),LEN(Rate)))-1))+1))+1
    463 FROM tblRates
    464 
    465 select RateID,
    466 replace(parsename(replace(replace(
    467 Rate, '.''/'), ',''.'), 3), '/''.'AS 'A',
    468 replace(parsename(replace(replace(
    469 Rate, '.''/'), ',''.'), 2), '/''.'AS 'B',
    470 replace(parsename(replace(replace(
    471 Rate, '.''/'), ',''.'), 1), '/''.')  AS 'C'
    472 from   tblRates
    473 
    474 CREATE FUNCTION [dbo].[SPLIT] (
    475 
    476 @str_in VARCHAR(8000),
    477 
    478 @separator VARCHAR(4) )
    479 
    480 RETURNS @strtable TABLE (strval VARCHAR(8000))
    481 
    482 AS
    483 
    484 BEGIN
    485 
    486 DECLARE
    487 
    488 @Occurrences INT,
    489 
    490 @Counter INT,
    491 
    492 @tmpStr VARCHAR(8000)
    493 
    494 SET @Counter = 0
    495 
    496 IF SUBSTRING(@str_in,LEN(@str_in),1<> @separator
    497 
    498 SET @str_in = @str_in + @separator
    499 
    500 SET @Occurrences = (DATALENGTH(REPLACE(@str_in,@separator,@separator+'#')) - DATALENGTH(@str_in))/ DATALENGTH(@separator)
    501 
    502 SET @tmpStr = @str_in
    503 
    504 WHILE @Counter <= @Occurrences
    505 
    506 BEGIN
    507 
    508 SET @Counter = @Counter + 1
    509 
    510 INSERT INTO @strtable
    511 
    512 VALUES ( SUBSTRING(@tmpStr,1,CHARINDEX(@separator,@tmpStr)-1))
    513 
    514 SET @tmpStr = SUBSTRING(@tmpStr,CHARINDEX(@separator,@tmpStr)+1,8000)
    515 
    516 
    517 IF DATALENGTH(@tmpStr= 0
    518 
    519 BREAK
    520 
    521 
    522 END
    523 
    524 RETURN
    525 
    526 END
    527 
    528 GO
    529 
    530 --
    531 CREATE FUNCTION [dbo].[Split]
    532 (
    533 @pvcSearchString VARCHAR(8000),
    534 @pvcSeparator VARCHAR(5)
    535 )
    536 
    537 RETURNS @strtable TABLE (strval VARCHAR(8000))
    538 
    539 AS
    540 
    541 BEGIN
    542 DECLARE
    543 @tmpStr VARCHAR(8000),
    544 @intSeparatorLength INT
    545 
    546 SET @intSeparatorLength = LEN(@pvcSeparator)
    547 
    548 SET @tmpStr = @pvcSearchString
    549 WHILE 1=1
    550 BEGIN
    551 INSERT INTO @strtable VALUES ( SUBSTRING(@tmpStr0 ,CHARINDEX(@pvcSeparator,@tmpStr)))
    552 SET @tmpStr = SUBSTRING(@tmpStr,CHARINDEX(@pvcSeparator,@tmpStr)+LEN(@pvcSeparator),8000)
    553 IF CHARINDEX(@pvcSeparator,@tmpStr< 1
    554 BREAK
    555 END
    556 
    557 RETURN
    558 END
    559 
    560 --
    561 /*
    562 Sample Delineated Data From [Col1]:
    563 "Item 1 | Item 2 | Item 3"
    564 
    565 Desired Target Result:
    566 [ColItem1],[ColItem2],[ColItem3]
    567 “Item 1”, Item 2”, Item 3”
    568 
    569 Use the MS SQL PARSENAME function to achieve this. It’s a little backwards from how you think it should work, but follow this example to get the basic idea. PARSENAME can by used in similar fashion to a split function.
    570 
    571 Sample Syntax (default delimited style):
    572 */
    573 Select
    574 PARSENAME([Col1],3as ColItem1
    575 ,PARSENAME([Col1],2as ColItem2
    576 ,PARSENAME([Col1],1as ColItem3
    577 From [myTable]
    578 
    579 --Sample Syntax (dealing with the pipe | ):
    580 
    581 Select
    582 PARSENAME(replace([Col1],'|','.'),3as ColItem1
    583 ,PARSENAME(replace([Col1],'|','.'),2as ColItem2
    584 ,PARSENAME(replace([Col1],'|','.'),1as ColItem3
    585 From [myTable]
    586 
    587 ---split column with part of text string
    588 CREATE TABLE myTable99(Col1 varchar(255))
    589 GO
    590 
    591 SET NOCOUNT ON
    592 INSERT INTO myTable99(Col1)
    593 SELECT 'name: johnson email: firstname: philip need: doc 12' UNION ALL
    594 SELECT 'name: johnson email: pjohnson@yahoo.com firstname: philip need: doc 13'
    595 GO
    596 
    597 CREATE FUNCTION udf_GetString(@Col1 varchar(255), @tag varchar(255))
    598 RETURNS varchar(255)
    599 AS
    600   BEGIN
    601 DECLARE @str varchar(255)
    602     SELECT      @str = SUBSTRING(@Col1
    603         , CHARINDEX(@tag,@Col1)+1+LEN(@tag)
    604         , CHARINDEX(' ',Col1,CHARINDEX(@tag,@Col1)+1+LEN(@tag))-(CHARINDEX(@tag,@Col1)+1+LEN(@tag)))
    605       FROM myTable99
    606     RETURN @str
    607   END
    608 GO
    609 
    610 SELECT       dbo.udf_GetString(Col1,'firstname:')
    611     , dbo.udf_GetString(Col1,'email:')
    612     , dbo.udf_GetString(Col1,'need:')
    613     , Col1
    614 FROM myTable99
    615 GO
    616 
    617 DECLARE @tag varchar(255)
    618 SELECT @tag = 'firstname:'
    619     SELECT      SUBSTRING(Col1
    620         , CHARINDEX(@tag,Col1)+1+LEN(@tag)
    621         , CHARINDEX(' ',Col1,CHARINDEX(@tag,Col1)+1+LEN(@tag))-(CHARINDEX(@tag,Col1)+1+LEN(@tag)))
    622       FROM myTable99
    623 SELECT @tag = 'email:'
    624     SELECT      SUBSTRING(Col1
    625         , CHARINDEX(@tag,Col1)+1+LEN(@tag)
    626         , CHARINDEX(' ',Col1,CHARINDEX(@tag,Col1)+1+LEN(@tag))-(CHARINDEX(@tag,Col1)+1+LEN(@tag)))
    627       FROM myTable99
    628 SELECT @tag = 'need:'
    629     SELECT      SUBSTRING(Col1
    630         , CHARINDEX(@tag,Col1)+1+LEN(@tag)
    631         , CHARINDEX(' ',Col1,CHARINDEX(@tag,Col1)+1+LEN(@tag))-(CHARINDEX(@tag,Col1)+1+LEN(@tag)))
    632       FROM myTable99
    633 GO
    634 
    635 
    636 SET NOCOUNT OFF
    637 DROP FUNCTION udf_GetString
    638 DROP TABLE myTable99
    639 GO
    640 
    641 SELECT * FROM [dbo].[SPLIT]('1,2,3')
    642 
    643 
    644 CREATE FUNCTION [dbo].[SPLIT]
    645 (
    646 @Text TEXT
    647 )
    648 RETURNS @output TABLE(
    649 Item INT
    650 )
    651 BEGIN
    652 
    653 DECLARE @start INT@end INT , @Datalen INT
    654 
    655 
    656 SELECT @start = 1,
    657 @end = CHARINDEX(','@Text),
    658 @Datalen = DATALENGTH(@Text+ 1
    659 
    660 WHILE @start < @Datalen BEGIN
    661 IF @end <= @start BEGIN
    662 SET @end = @Datalen
    663 END
    664 
    665 INSERT INTO @output (Item)
    666 VALUES (SUBSTRING(@Text@start@end - @start))
    667 
    668 SET @start = @end + 1
    669 SET @end = CHARINDEX(','SUBSTRING(@Text@start,20)) + @start -1
    670 END
    671 RETURN
    672 END
    673 
    674 
    675 
    676 And here get 2 fields
    677 
    678 SELECT * FROM [dbo].[SPLIT_2]('1_1,2_1,2_2')
    679 
    680 CREATE FUNCTION [dbo].[SPLIT_2]
    681 (
    682 @Text TEXT
    683 )
    684 RETURNS @output TABLE(
    685 Document_id INT,IndexOf int
    686 )
    687 BEGIN
    688 
    689 DECLARE @start INT@end INT , @Datalen INT ,
    690 @Values VARCHAR(50), @Document VARCHAR(5),
    691 @Index VARCHAR(5), @CharIndex INT
    692 
    693 SELECT @start = 1,
    694 @end = CHARINDEX(','@Text),
    695 @Datalen = DATALENGTH(@Text+ 1
    696 
    697 WHILE @start < @Datalen BEGIN
    698 IF @end <= @start BEGIN
    699 SET @end = @Datalen
    700 END
    701 
    702 SET @Values = SUBSTRING(@Text@start@end - @start)
    703 SET @CharIndex = CHARINDEX('_'@Values)
    704 
    705 SET @Document = SUBSTRING(@Values,0,@CharIndex)
    706 SET @Index = SUBSTRING(@Values,@CharIndex+1,5)
    707 
    708 INSERT INTO @output (document_id , IndexOf)
    709 VALUES (@Document,@Index)
    710 
    711 SET @start = @end + 1
    712 SET @end = CHARINDEX(','SUBSTRING(@Text@start,20)) + @start -1
    713 END
    714 RETURN
    715 
    716 
    717 ---SQL: String Split  Function
    718 CREATE FUNCTION Split(@String varchar(4000), @Delimiter char(1))
    719 RETURNS @Results TABLE (ID int, Items nvarchar(4000))
    720 AS
    721 
    722 BEGIN
    723     DECLARE @INDEX INT
    724     DECLARE @SLICE nvarchar(4000)
    725     DECLARE @ID int
    726 
    727     SELECT @INDEX = 1@ID = 1
    728     WHILE @INDEX !=0
    729 
    730         BEGIN
    731          -- GET THE INDEX OF THE FIRST OCCURENCE OF THE SPLIT CHARACTER
    732          SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
    733          -- NOW PUSH EVERYTHING TO THE LEFT OF IT INTO THE SLICE VARIABLE
    734          IF @INDEX !=0
    735           SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
    736          ELSE
    737           SELECT @SLICE = @STRING
    738          -- PUT THE ITEM INTO THE RESULTS SET
    739          INSERT INTO @Results(ID, Items) VALUES(@ID@SLICE)
    740          SELECT @ID = @ID + 1
    741          -- CHOP THE ITEM REMOVED OFF THE MAIN STRING
    742          SELECT @STRING = RIGHT(@STRING,LEN(@STRING- @INDEX)
    743          -- BREAK OUT IF WE ARE DONE
    744          IF LEN(@STRING= 0 BREAK
    745         END
    746     RETURN 
    747 
    748 select Items from dbo.Split(@List',')
    749 
    750 Create FUNCTION Split(@String varchar(4000), @Delimiter char(1))
    751 RETURNS @Results TABLE (ID int, Items nvarchar(4000))
    752 AS
    753 
    754 BEGIN
    755 DECLARE @INDEX INT
    756 DECLARE @SLICE nvarchar(4000)
    757 DECLARE @ID int
    758 
    759 SELECT @INDEX = 1@ID = 1
    760 WHILE @INDEX !=0
    761 
    762 BEGIN
    763 -- GET THE INDEX OF THE FIRST OCCURENCE OF THE SPLIT CHARACTER
    764 SELECT @INDEX = CHARINDEX(@Delimiter,@String)
    765 -- NOW PUSH EVERYTHING TO THE LEFT OF IT INTO THE SLICE VARIABLE
    766 IF @INDEX !=0
    767 SELECT @SLICE = LEFT(@String,@INDEX - 1)
    768 ELSE
    769 SELECT @SLICE = @String
    770 -- PUT THE ITEM INTO THE RESULTS SET
    771 INSERT INTO @Results(ID, Items) VALUES(@ID@SLICE)
    772 SELECT @ID = @ID + 1
    773 -- CHOP THE ITEM REMOVED OFF THE MAIN STRING
    774 SELECT @String = RIGHT(@String,LEN(@String- @INDEX)
    775 -- BREAK OUT IF WE ARE DONE
    776 IF LEN(@String= 0 BREAK
    777 END
    778 Return
    779 END
    780 
    781 


  • 相关阅读:
    Win7下安装iMac系统
    Windows平台cocos2d-x 3.0 android开发环境
    iOS Dev (50)用代码实现图片加圆角
    内部消息 微软中国云计算 内測Azure免费账号 赶紧申请 错过不再有
    android锁屏软件制作
    CF1019E Raining season
    各数据库系统独有函数
    其他函数
    日期时间函数
    字符串函数
  • 原文地址:https://www.cnblogs.com/geovindu/p/1687707.html
Copyright © 2011-2022 走看看