日期:2014-05-18  浏览次数:20593 次

取字符串问题,急……
有类似下面的这样一个字符串
A121,B456,C1215
比如说A121是一个串,和B456是分开的,中间以 ', '来分隔,
我建了一个临时表#P(DH   varchar(30))来存放底下的数据
A121
B456
C1215
就是要把上面的字符串以 ', '隔开的字符串插到临时表,
要怎么操作速度会比较快一点?谢谢
这个字符串长度无法得知,而且每个字符串(就是‘,’分隔开的)
长度也是无法确定的,只知道最多不会超过30位

------解决方案--------------------


/*
功能:实现split功能的函数
*/

create function fn_split
(
@inputstr varchar(8000),
@seprator varchar(10)
)
returns @temp table (a varchar(200))
as

begin
declare @i int

set @inputstr = rtrim(ltrim(@inputstr))
set @i = charindex(@seprator, @inputstr)

while @i > = 1
begin
insert @temp values(left(@inputstr, @i - 1))

set @inputstr = substring(@inputstr, @i + 1, len(@inputstr) - @i)
set @i = charindex(@seprator, @inputstr)
end

if @inputstr <> '\ '
insert @temp values(@inputstr)

return
end



------解决方案--------------------
CREATE FUNCTION dbo.f_splitSTR(
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS @re TABLE(col varchar(100))
AS
BEGIN
--创建分拆处理的辅助表(用户定义函数中只能操作表变量)
DECLARE @t TABLE(ID int IDENTITY,b bit)
INSERT @t(b) SELECT TOP 8000 0 FROM syscolumns a,syscolumns b

INSERT @re SELECT SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID)
FROM @t
WHERE ID <=LEN(@s+ 'a ')
AND CHARINDEX(@split,@split+@s,ID)=ID
RETURN
END
GO
select * from dbo.f_splitSTR( 'aaaa,bbbbb,ccccccc ', ', ')
------解决方案--------------------
declare @sql varchar(8000)
set @sql= 'A121,B456,C1215 '
print @sql
create table tmp(id varchar(30))
set @sql= 'insert into tmp select ' ' '+replace(@sql, ', ', ' ' ';insert into tmp select ' ' ')+ ' ' ' '
exec( @sql)
select * from tmp

------解决方案--------------------
create table ta(id int,tag varchar(1000))
insert ta select 1, '飞机,大炮,轮船,火箭,火箭,飞机 '
insert ta select 2, '飞机,楼房 '
insert ta select 3, '飞机,火箭,大炮 '
insert ta select 4, '飞机,飞机,飞机 '


SELECT TOP 100 id = IDENTITY(int, 1, 1)
INTO #a --创建临时辅助表
FROM syscolumns a, syscolumns b

SELECT A.id,
tag=SUBSTRING(A.tag, B.id, CHARINDEX( ', ', A.tag + ', ', B.id) - B.id)
FROM ta A, #a B
WHERE SUBSTRING( ', ' + A.tag, B.id, 1) = ', '

id tag
----------- ----------------------------------------------------------------------------------------------------------------
1 飞机
1 大炮
1 轮船
1 火箭
1 火箭
1 飞机
2 飞机
2 楼房
3 飞机
3 火箭
3 大炮
4 飞机
4 飞机
4 飞机

(所影响的行数为 14 行)