刚发了一贴,结果跟自己设想的有一些出入,再求答案

sunhonglei2004 2008-04-11 04:03:20
declare @a varchar(30)
set @a='张三,李四,王五,马六'

如何将@a中的数据按逗号分隔开,并写入四个字段中.如

a b c d ---字段名
张三 李四 王五 马六 ---记录

但逗号之间不限于只是两个字,可能更多,求助,

谢谢
...全文
77 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenxin2835 2008-04-11
  • 打赏
  • 举报
回复
学习
fcuandy 2008-04-11
  • 打赏
  • 举报
回复
declare @a varchar(8000)  
set @a='张三,李四,王五,马六,xx,yy'
set @a='select ''' + replace(@a,',',''',''') + ''''
exec (@a)
fcuandy 2008-04-11
  • 打赏
  • 举报
回复
declare @a varchar(8000)  
set @a='张三,李四,王五,马六,xx,yy'
set @a='select ''' + replace(@a,',',''',''') + ''''
drop table t
-狙击手- 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sunhonglei2004 的回复:]
各位高手,如果
@a='张三,李四,王五,马六,刘七,孙八'

或者更多呢??同样能实现吗
[/Quote]

也一字排开?

a b c d e f
张三 李四 王五 马六 刘七 孙八 。。。。。
sunhonglei2004 2008-04-11
  • 打赏
  • 举报
回复
各位高手,如果
@a='张三,李四,王五,马六,刘七,孙八'

或者更多呢??同样能实现吗
hexiaojie 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wzy_love_sly 的回复:]
SQL codeif object_id('tb') is not null
drop table tb
go
create table tb(a varchar(10),b varchar(10),c varchar(10),d varchar(10))
go
declare @a varchar(30)
set @a='张三,李四,王五,马六'
set @a=replace(@a,',','.')
insert into tb (a,b,c,d) select parsename(@a,4),parsename(@a,3),parsename(@a,2),parsename(@a,1)
go
select * from tb




a b c d
张三 李四 王五 马六
学习了
[/Quote]
fcuandy 2008-04-11
  • 打赏
  • 举报
回复
declare @a varchar(8000)  
set @a='张三,李四,王五,马六'
create table t(a varchar(20),b varchar(20),c varchar(20),d varchar(20))
set @a='select ''' + replace(@a,',',''',''') + ''''
exec('insert t ' + @a)
select * from t
drop table t
wzy_love_sly 2008-04-11
  • 打赏
  • 举报
回复
if object_id('tb') is not null
drop table tb
go
create table tb(a varchar(10),b varchar(10),c varchar(10),d varchar(10))
go
declare @a varchar(30)
set @a='张三,李四,王五,马六'
set @a=replace(@a,',','.')
insert into tb (a,b,c,d) select parsename(@a,4),parsename(@a,3),parsename(@a,2),parsename(@a,1)
go
select * from tb



a b c d
张三 李四 王五 马六
dawugui 2008-04-11
  • 打赏
  • 举报
回复
declare @a varchar(30) 
set @a='张三,李四,王五,马六'

select A = PARSENAME(replace(@a,',','.'),4) ,
B = PARSENAME(replace(@a,',','.'),3) ,
C = PARSENAME(replace(@a,',','.'),2) ,
D = PARSENAME(replace(@a,',','.'),1)

/*
A B C D
-------- ------- -------- ----
张三 李四 王五 马六

(所影响的行数为 1 行)

*/
flairsky 2008-04-11
  • 打赏
  • 举报
回复

/*
标题:分解字符串并查询相关数据
作者:爱新觉罗.毓华
时间:2008-03-18
地点:广东深圳
说明:通过使用函数等方法分解字符串查询相关数据。

问题:通过分解一个带某种符号分隔的字符串在数据库中查找相关数据。
例如 @str = '1,2,3',查询下表得到记录1,4,5,6
ID TypeID
1 1,2,3,4,5,6,7,8,9,10,11,12
2 2,3
3 3,7,8,9
4 2,6
5 4,5
6 6,7
*/
-----------------------------
create table tb (ID int , TypeID varchar(30))
insert into tb values(1 , '1,2,3,4,5,6,7,8,9,10,11,12')
insert into tb values(2 , '2,3')
insert into tb values(3 , '3,7,8,9')
insert into tb values(4 , '2,6')
insert into tb values(5 , '4,5')
insert into tb values(6 , '6,7')
go
-----------------------------
--如果仅仅是一个,如@str = '1'.
declare @str as varchar(30)
set @str = '1'
select * from tb where charindex(',' + @str + ',' , ',' + TypeID + ',') > 0
select * from tb where ',' + TypeID + ',' like '%,' + @str + ',%'
/*
ID TypeID
----------- ------------------------------
1 1,2,3,4,5,6,7,8,9,10,11,12
(所影响的行数为 1 行)
*/

-----------------------------
--如果包含两个,如@str = '1,2'.
declare @str as varchar(30)
set @str = '1,2'
select * from tb where charindex(',' + left(@str , charindex(',' , @str) - 1) + ',' , ',' + typeid + ',') > 0 or
charindex(',' + substring(@str , charindex(',' , @str) + 1 , len(@str)) + ',' , ',' + typeid + ',') > 0
select * from tb where ',' + typeid + ',' like '%,' + left(@str , charindex(',' , @str) - 1) + ',%' or
',' + typeid + ',' like '%,' + substring(@str , charindex(',' , @str) + 1 , len(@str)) + ',%'
/*
ID TypeID
----------- ------------------------------
1 1,2,3,4,5,6,7,8,9,10,11,12
2 2,3
4 2,6
(所影响的行数为 3 行)
*/

-------------------------------------------
--如果包含三个或四个,用PARSENAME函数来处理.
declare @str as varchar(30)
set @str = '1,2,3,4'
select * from tb where
charindex(',' + parsename(replace(@str , ',' , '.') , 4) + ',' , ',' + typeid + ',') > 0 or
charindex(',' + parsename(replace(@str , ',' , '.') , 3) + ',' , ',' + typeid + ',') > 0 or
charindex(',' + parsename(replace(@str , ',' , '.') , 2) + ',' , ',' + typeid + ',') > 0 or
charindex(',' + parsename(replace(@str , ',' , '.') , 1) + ',' , ',' + typeid + ',') > 0
select * from tb where
',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 4) + ',%' or
',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 3) + ',%' or
',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 2) + ',%' or
',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 1) + ',%'
/*
ID TypeID
----------- ------------------------------
1 1,2,3,4,5,6,7,8,9,10,11,12
2 2,3
3 3,7,8,9
4 2,6
5 4,5
(所影响的行数为 5 行)
*/

---------------------------------------
--如果超过四个,则只能使用函数或动态SQL来分解并查询数据。
/*
名称:fn_split函数.
功能:实现字符串分隔功能的函数
*/
create function dbo.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
go

--调用
declare @str as varchar(30)
set @str = '1,2,3,4,5'

select distinct m.* from tb m,
(select * from dbo.fn_split(@str,',')) n
where charindex(',' + n.a + ',' , ',' + m.typeid + ',') > 0

drop table tb
drop function dbo.fn_split

/*
ID TypeID
----------- ------------------------------
1 1,2,3,4,5,6,7,8,9,10,11,12
2 2,3
3 3,7,8,9
4 2,6
5 4,5
(所影响的行数为 5 行)
*/

------------------------------------------
--使用动态SQL的语句。
declare @str varchar(200)
declare @sql as varchar(1000)
set @str = '1,2,3,4,5'
set @sql = 'select ''' + replace(@str , ',' , ''' as id union all select ''')
set @sql = @sql + ''''
set @sql = 'select distinct a.* from tb a , (' + @sql + ') b where charindex(' + ''','' + b.id + ' + ''',''' + ' , ' + ''','' + a.typeid + ' + ''',''' + ') > 0 '
exec (@sql)
/*
ID TypeID
----------- ------------------------------
1 1,2,3,4,5,6,7,8,9,10,11,12
2 2,3
3 3,7,8,9
4 2,6
5 4,5
(所影响的行数为 5 行)
*/
dawugui 2008-04-11
  • 打赏
  • 举报
回复
declare @a varchar(30)
set @a='1,2,3,4'

select A = PARSENAME(replace(@a,',','.'),4) ,
B = PARSENAME(replace(@a,',','.'),3) ,
C = PARSENAME(replace(@a,',','.'),2) ,
D = PARSENAME(replace(@a,',','.'),1)

/*
A B C D
-- -- -- --
1 2 3 4

(所影响的行数为 1 行)

*/

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧