分割字符串
本来想用split函数,但在查询分析器中中文都变成了“?”,没办法,只能一步步来了。
declare @chvString varchar(100)
set @chvString='经济类型:120 生产产值:30-50万 人员数量:17人  开业年份:1998'
declare @a varchar(10),@b varchar(10),@c varchar(10),@d varchar(10)

declare @start int,@end intset @start=CHARINDEX(':',@chvString)
set @end=CHARINDEX(' ',@chvString)
set @a=substring(@chvString,@start+1,@end-@start)
set @chvString=Ltrim(Right(@chvString,len(@chvString)-@end))set @start=CHARINDEX(':',@chvString)
set @end=CHARINDEX(' ',@chvString)
set @b=substring(@chvString,@start+1,@end-@start)
set @b=Left(@b,len(@b)-1)
set @chvString=Ltrim(Right(@chvString,len(@chvString)-@end))set @start=CHARINDEX(':',@chvString)
set @end=CHARINDEX(' ',@chvString)
set @c=substring(@chvString,@start+1,@end-@start)
set @c=Left(@c,len(@c)-1)
set @chvString=Ltrim(Right(@chvString,len(@chvString)-@end))set @d=Right(@chvString,4)select @a as 经济类型,@b as 生产产值,@c as 人员数量,@d as 开业年份
得到结果-----------------
经济类型       生产产值       人员数量       开业年份       
---------- ---------- ---------- ---------- 
120        30-50      17         1998
用游标取出Re字段,分割后插入到新的数据库

解决方案 »

  1.   

    --tryCREATE FUNCTION SplitRe (@splitString VARCHAR(8000), @separate VARCHAR(10))
    RETURNS @returnTable TABLE(value1 VARCHAR(20), value2 VARCHAR(20), value3 VARCHAR(20), value4 VARCHAR(20))
    ASBEGINDECLARE @thisSplitStr VARCHAR(20)
    DECLARE @thisSepIndex INT
    DECLARE @lastSepIndex INTDECLARE @value1 AS VARCHAR(20)
    DECLARE @value2 AS VARCHAR(20)
    DECLARE @value3 AS VARCHAR(20)
    DECLARE @value4 AS VARCHAR(20)
    DECLARE @i AS INTSET @value1 = ''
    SET @value2 = ''
    SET @value3 = ''
    SET @value4 = ''
    SET @i = 1
    SET @splitString = REPLACE(@splitString, '经济类型', '')
    SET @splitString = REPLACE(@splitString, '生产产值', '')
    SET @splitString = REPLACE(@splitString, '人员数量', '')
    SET @splitString = REPLACE(@splitString, '开业年份', '')
    SET @splitString = REPLACE(@splitString, '万', '')
    SET @splitString = REPLACE(@splitString, '人', '')
    SET @splitString = SUBSTRING(@splitString, 2, LEN(@splitString))
    SET @splitString = LTRIM(RTRIM(@splitString))SET @lastSepIndex = 0IF RIGHT(@splitString ,LEN(@separate)) <> @separate SET @splitString = @splitString + @separate
    SET @thisSepIndex = CHARINDEX(@separate,@splitString ,@lastSepIndex)WHILE @lastSepIndex <= @thisSepIndex
    BEGIN
             SET @thisSplitStr = SUBSTRING(@splitString ,@lastSepIndex,@thisSepIndex-@lastSepIndex)
             SET @lastSepIndex = @thisSepIndex + 1
             SET @thisSepIndex = CHARINDEX(@separate,@splitString ,@lastSepIndex)
             IF @i % 4 = 1
    SET @value1 = @thisSplitStr
             IF @i % 4 = 2
    SET @value2 = @thisSplitStr
             IF @i % 4 = 3
    SET @value3 = @thisSplitStr
             IF @i % 4 = 0
    SET @value4 = @thisSplitStr
             IF @i % 4 = 0
              INSERT INTO @returnTable VALUES(@value1, @value2, @value3, @value4)
             SET @i = @i + 1
    END
    RETURNEND--调用DECLARE @Str AS VARCHAR(1000)SET @Str = '经济类型:120 生产产值:30-50万 人员数量:17人  开业年份:1998
    经济类型:159 生产产值:30-50万 人员数量:14人  开业年份:1997
    经济类型:120 生产产值:30-50万 人员数量:6人  开业年份:1997
    经济类型:120 生产产值:0-30万 人员数量:5人  开业年份:1993'SELECT * FROM dbo.SplitRe(@Str, ':')/*
    结果如下:
    val1     val2      val3      val4
    120  30-50  17   1998    
    159  30-50  14   1997    
    120  30-50  6   1997    
    120  0-30  5   1993(4 row(s) affected)
    */
      

  2.   

    --定义表A
    declare @tmpA Table 
    (
    id int IDENTITY(1,1) PRIMARY KEY,
    re varchar(100)
    )
    insert into @tmpA values('经济类型:120 生产产值:30-50万 人员数量:17人  开业年份:1998')
    insert into @tmpA values('经济类型:159 生产产值:30-50万 人员数量:14人  开业年份:1997')
    insert into @tmpA values('经济类型:120 生产产值:30-50万 人员数量:6人  开业年份:1997')
    insert into @tmpA values('经济类型:120 生产产值:0-30万 人员数量:5人  开业年份:1993')
    --显示表A
    select * from @tmpA
    --定义表Re
    declare @tmpRe Table 
    (
    id int IDENTITY(1,1) PRIMARY KEY,
    A_id int,
    Val1 varchar(10),
    Val2 varchar(10),
    Val3 varchar(10),
    Val4 varchar(10) 
    )
    --使用游标
    declare P1 cursor for
    select * from @tmpA
    declare @id int,@re varchar(1000)
    declare @a varchar(10),@b varchar(10),@c varchar(10),@d varchar(10)
    declare @start int,@end int
    Open P1
    Fetch Next From P1 Into @id,@re
    While @@Fetch_status=0
    Begin
    --经济类型
    set @start=CHARINDEX(':',@re)
    set @end=CHARINDEX(' ',@re)
    set @a=substring(@re,@start+1,@end-@start)
    set @re=Ltrim(Right(@re,len(@re)-@end))
    --生产产值
    set @start=CHARINDEX(':',@re)
    set @end=CHARINDEX(' ',@re)
    set @b=substring(@re,@start+1,@end-@start)
    set @b=Left(@b,len(@b)-1)
    set @re=Ltrim(Right(@re,len(@re)-@end))
    --人员数量
    set @start=CHARINDEX(':',@re)
    set @end=CHARINDEX(' ',@re)
    set @c=substring(@re,@start+1,@end-@start)
    set @c=Left(@c,len(@c)-1)
    set @re=Ltrim(Right(@re,len(@re)-@end))
    --开业年份
    set @d=Right(@re,4)
    Insert into @tmpRe values(@id,@a,@b,@c,@d)
    Fetch Next From P1 Into @id,@re
    End
    Close P1
    Deallocate P1
    --显示表Re
    select * from @tmpRe-----------------
    -----------------
    -----------------
    显示结果 
    表A
    id          re                                                            
    ----------- ------------------------------------------------------------------------
    1           ????:120 ????:30-50? ????:17?  ????:1998
    2           ????:159 ????:30-50? ????:14?  ????:1997
    3           ????:120 ????:30-50? ????:6?  ????:1997
    4           ????:120 ????:0-30? ????:5?  ????:1993
    表Re
    id          A_id        Val1       Val2       Val3       Val4       
    ----------- ----------- ---------- ---------- ---------- ---------- 
    1           1           120        30-50      17         1998
    2           2           159        30-50      14         1997
    3           3           120        30-50      6          1997
    4           4           120        0-30       5          1993