截取字符串时,查找某字符第二次出现的位置,怎么查啊

木易随风 2010-05-26 10:09:15

declare @i int
declare @str varchar(max)
set @i=0
set @str='88266,张三,12,十六,齐亮,NULL'+','
select substring(@str,1,charindex(',',@str,1)-1),
substring(),substring()

怎么截取出第二个,第三个。
想得到的格式是
列1 列2 列3 ……
88266 张三 12 ……

能不能这样一句话写,我写了一个方法截取出来的结果是多行形式的,我现在需要是一行的。
...全文
2882 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
chuifengde 2010-05-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 shuchong1983 的回复:]
引用 5 楼 xman_78tom 的回复:
SQL code

-- 投机取巧
declare @str varchar(max);
set @str='''88266'',''张三'',''12'',''十六'',''齐亮'',NULL';
exec('select '+@str);
/*
88266 张三 12 十六 齐亮 NULL
*/


o(∩_∩)o 一语点醒梦中……
[/Quote]
不要列名,这个当然最简单
crszf 2010-05-26
  • 打赏
  • 举报
回复
Alter Proc ProcA
@Str VarChar(100) = ''
As
Declare @ColName VarChar(10),@Col VarChar(24),@II Int,@StrSql VarChar(1000),@JJ Int
Set @JJ = 1
Set @ColName = '列' + Ltrim(Convert(VarChar(10),@JJ))
Set @II = CharIndex(',',@Str)
Set @Col = Left(@Str,@II - 1)

If Right(@Str,1) <> ','
Set @Str = @Str + ','

Set @StrSql = ' If Object_ID(''A'') Is Not Null ' +
' Drop Table A' +
' Create Table A(' + @ColName + ' VarChar(10) Not Null Default '''')' +
' Insert Into A(' + @ColName + ') Select ''' + @Col + ''''
Exec(@StrSql)

Set @Str = Right(@Str,Len(@Str) - @II)
Set @II = CharIndex(',',@Str)

While @II > 0
Begin
Set @JJ = @JJ + 1
Set @ColName = '列' + Ltrim(Convert(VarChar(2),@JJ))
Set @Col = Left(@Str,@II - 1)
Set @StrSql = ' Alter Table A ' +
' Add ' + @ColName + ' VarChar(10) Not Null Default '''''
Exec(@StrSql)

Set @StrSql = ' Update A Set ' + @ColName + ' = ''' + @Col + ''''
Exec(@StrSql)

Set @Str = Right(@Str,Len(@Str) - @II)
Set @II = CharIndex(',',@Str)
End
Select * From A
Go

--PRocA '88266,张三,12,十六,齐亮,NULL,'
木易随风 2010-05-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xman_78tom 的回复:]
SQL code

-- 投机取巧
declare @str varchar(max);
set @str='''88266'',''张三'',''12'',''十六'',''齐亮'',NULL';
exec('select '+@str);
/*
88266 张三 12 十六 齐亮 NULL
*/
[/Quote]
o(∩_∩)o 一语点醒梦中人啊,既然字符串都规整成这样了,还费事去想法把他转成表,o(︶︿︶)o 唉。
老黎 2010-05-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xman_78tom 的回复:]
SQL code

-- 投机取巧
declare @str varchar(max);
set @str='''88266'',''张三'',''12'',''十六'',''齐亮'',NULL';
exec('select '+@str);
/*
88266 张三 12 十六 齐亮 NULL
*/
[/Quote]
可行!
来个replace
htl258_Tony 2010-05-26
  • 打赏
  • 举报
回复
declare @str varchar(max)
set @str='88266,张三,12,十六,齐亮,NULL'

select dbo.f_GetStr(@str,1,',') A,
dbo.f_GetStr(@str,2,',') B,
dbo.f_GetStr(@str,3,',') C,
dbo.f_GetStr(@str,4,',') D,
dbo.f_GetStr(@str,5,',') E,
dbo.f_GetStr(@str,6,',') F
/*
A B C D E F
88266 张三 12 十六 齐亮 NULL
*/
htl258_Tony 2010-05-26
  • 打赏
  • 举报
回复
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_GetStr]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_GetStr]
GO

--分段截取函数(邹建)
CREATE FUNCTION dbo.f_GetStr(
@s varchar(8000), --包含多个数据项的字符串
@pos int, --要获取的数据项的位置
@split varchar(10) --数据分隔符
)RETURNS varchar(100)
AS
BEGIN
IF @s IS NULL RETURN(NULL)
DECLARE @splitlen int
SELECT @splitlen=LEN(@split+'a')-2
WHILE @pos>1 AND CHARINDEX(@split,@s+@split)>0
SELECT @pos=@pos-1,
@s=STUFF(@s,1,CHARINDEX(@split,@s+@split)+@splitlen,'')
RETURN(ISNULL(LEFT(@s,CHARINDEX(@split,@s+@split)-1),''))
END
GO
这个好像比较实用,推荐一下
木易随风 2010-05-26
  • 打赏
  • 举报
回复

谢谢chuifengde提供的方法,根据你的方法我改写了一下,因为你的方法中要创建表,这个在实际中不方便,我改成了表变量。


declare @i int ,@x int
declare @sql varchar(1000)
declare @str varchar(max)
set @str='''88266'',''张三'',''12'',''十六'',''齐亮'',NULL'

select @x=0,@i=len(@str)-len(replace(@str+',',',',''))
while @x<=@i
begin
select @sql=isnull(@sql+',','')+'[列'+ltrim(@x)+'] varchar(100)'
set @x=@x+1
end
exec('declare @tb table('+@sql+')
insert @tb select '+@str+'
select * from @tb')

xman_78tom 2010-05-26
  • 打赏
  • 举报
回复

-- 投机取巧
declare @str varchar(max);
set @str='''88266'',''张三'',''12'',''十六'',''齐亮'',NULL';
exec('select '+@str);
/*
88266 张三 12 十六 齐亮 NULL
*/
木易随风 2010-05-26
  • 打赏
  • 举报
回复
是我弄错了,刚才犯晕,在执行存储过程传参时给加上()了。
chuifengde 2010-05-26
  • 打赏
  • 举报
回复

create PROC pp_ @str VARCHAR(1000)
AS
IF OBJECT_ID('[Table]') IS NOT NULL
DROP TABLE [Table]
declare @i int ,@x int
declare @sql varchar(1000)

select @x=0,@i=len(@str)-len(replace(@str+',',',',''))
while @x<=@i
begin
select @sql=isnull(@sql+',','')+'[列'+ltrim(@x)+'] varchar(100)'
set @x=@x+1
end
exec('create table [Table]('+@sql+')')
exec('insert [Table] select '+@str)
select * from [Table]


GO

declare @str varchar(1000)
set @str='''88266'',''张三'',''12'',''十六'',''齐亮'',NULL'

exec pp_ @str


--result
/*
列0 列1 列2 列3 列4 列5
------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------
88266 张三 12 十六 齐亮 NULL

(所影响的行数为 1 行)

*/
木易随风 2010-05-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chuifengde 的回复:]
SQL code
declare @i int ,@x int
declare @sql varchar(1000)
declare @str varchar(max)
set @str='''88266'',''张三'',''12'',''十六'',''齐亮'',NULL'

select @x=0,@i=len(@str)-len(replace(@str+',',',',''))……
[/Quote]

字符串改成这样的,往存储过程里传时,报错。
chuifengde 2010-05-26
  • 打赏
  • 举报
回复
declare @i int ,@x int
declare @sql varchar(1000)
declare @str varchar(max)
set @str='''88266'',''张三'',''12'',''十六'',''齐亮'',NULL'

select @x=0,@i=len(@str)-len(replace(@str+',',',',''))
while @x<=@i
begin
select @sql=isnull(@sql+',','')+'[列'+ltrim(@x)+'] varchar(100)'
set @x=@x+1
end
exec('create table [Table]('+@sql+')')
exec('insert [Table] select '+@str)
select * from [Table]

34,575

社区成员

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

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