首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

高手帮帮忙吧,100分相送,解决马上结帖解决办法

2012-03-01 
高手帮帮忙吧,100分相送,解决马上结帖例如,在一个字段里有一条记录。name小明,小强,张小敏,。。。我想通过存储

高手帮帮忙吧,100分相送,解决马上结帖
例如,在一个字段里有一条记录。

name
小明,小强,张小敏,。。。

我想通过存储过程,以逗号为标识,把里边的数据分出来,最后出来的结果是这样的

name
小明
小强
张小敏




加急,希望高手帮帮忙

[解决办法]
参考:

create table tblTest(PdID int,PdName varchar(100))

insert tblTest
select 1, 'A10 ' union all
select 2, 'A20,A20S ' union all
select 3, 'A30,A30K,A30M ' union all
select 4, 'A301 ' union all
select 5, 'A301M '
select * from tblTest
go

-- 建立一个辅助的临时表就可以了
SELECT TOP 8000
id = identity(int,1,1)
INTO # FROM syscolumns a, syscolumns b
-- 这个辅助表是什么含义,为下一步铺垫的目的是什么?
-- 以上生成一个临时表

SELECT
A.PdID,
PdName = SUBSTRING(A.PdName, B.ID, CHARINDEX( ', ', A.PdName + ', ', B.ID) - B.ID) --这个SUBSTRING在B.ID每一次执行的时候的值是多少?
FROM tblTest A, # B
WHERE SUBSTRING( ', ' + a.PdName, B.id, 1) = ', ' --这个where后面的检索条件又代表什么含义?
ORDER BY 1,2
GO

DROP TABLE tblTest, #


即:

CREATE TABLE A(id INT,country VARCHAR(100))
INSERT A
SELECT 1, '中国;日本;韩国 ' UNION ALL
SELECT 2, '美国;意大利;法国 ' UNION ALL
SELECT 3, '德国 '
SELECT * FROM A

-- 建立一个辅助的临时表就可以了
SELECT TOP 8000 id = identity(int,1,1)
INTO # FROM syscolumns a, syscolumns b


SELECT
A.ID,
COUNTRY = SUBSTRING(A.COUNTRY, B.ID, CHARINDEX( '; ', A.COUNTRY + '; ', B.ID) - B.ID)
FROM A, # B
WHERE SUBSTRING( '; ' + a.COUNTRY, B.id, 1) = '; '
ORDER BY 1,2
GO

DROP TABLE A,#

id country
----------- ----------------
1 中国;日本;韩国
2 美国;意大利;法国
3 德国

(所影响的行数为 3 行)

ID COUNTRY
----------- ---------
1 韩国
1 日本
1 中国
2 法国
2 美国
2 意大利
3 德国

(所影响的行数为 7 行)



[解决办法]
SQL2005实现:
CREATE TABLE A(id INT,country VARCHAR(100))
INSERT A
SELECT 1, '中国;日本;韩国 ' UNION ALL
SELECT 2, '美国;意大利;法国 ' UNION ALL
SELECT 3, '德国 '
--SELECT * FROM A

SELECT

c.id, B.value

FROM(

SELECT id, [country] = CONVERT(xml,

' <root> <v> ' + REPLACE([country], '; ', ' </v> <v> ') + ' </v> </root> ')

FROM A

)c

OUTER APPLY(

SELECT value = N.v.value( '. ', 'varchar(100) ')

FROM c.[country].nodes( '/root/v ') N(v)

)B
id value
----------- ----------------
1 日本
1 韩国
2 美国
2 意大利
2 法国
3 德国

(7 行受影响)
[解决办法]
我写过一个实现该功能的自定义函数:

--将字符串分隔后生成表的形式
CREATE function GetSplitStr
(
@SourceSql varchar(8000), --包含分隔符的字符串
@StrSeprate varchar(10) --分隔符
)
returns @temp table(id int, string varchar(100))
as
begin
set @SourceSql = @SourceSql + @StrSeprate

declare
@i int,
@row int

set @row=1


set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while (@i > 0)
begin
insert @temp values(@row, left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
set @row = @row + 1
end
if @SourceSql <> ' '
insert @temp values(@row, @SourceSql)
return
end


调用方法:
select * from dbo.GetSplitStr( '小强,小猫,小狗 ', ', ')


可以实现任何一种分隔符的通用。
[解决办法]
declare @AllChar varchar(50)
declare @FirstChar varchar(50)
declare @FirstPoint int
declare @lenth int

set @AllChar= '小明,小强,张小敏 ' ----可以传入一个字符串
set @lenth=len(@AllChar)
create table #Temp_String(FID int identity,Content varchar(50))
set @FirstPoint=charindex( ', ',@AllChar)

while( @FirstPoint> 0)
begin
set @FirstChar=substring(@AllChar,0,@FirstPoint)
--select @FirstChar
insert into #Temp_String(Content) values (@FirstChar)
set @AllChar=substring(@AllChar,@FirstPoint+1,@lenth)
set @FirstPoint=charindex( ', ',@AllChar)
end

insert into #Temp_String(Content) values (@AllChar)
select * from #Temp_String

------------
FID CONTENT

1 小明
2 小强
3 张小敏

热点排行