DECLARE @sItem NVARCHAR(255)
select @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'
while CHARINDEX(@sItem,N' ')>0
select @sItem=replace(@sItem,N' ',N'|')while CHARINDEX(@sItem,N' |')>0
select @sItem=replace(@sItem,N' |',N'|')while CHARINDEX(@sItem,N'| ')>0
select @sItem=replace(@sItem,N'| ',N'|')declare @sql Nvarchar(4000)create table ##T (a NVarchar(400))select @sql=N'insert ##T values (N'''+replace(@sItem,'|',N''') insert ##T values (N''')+N''')'
exec (@sql)select * from ##T -----子串
select count(*) from ##T ----子串的個數未测试!!!!!
select @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'
while CHARINDEX(@sItem,N' ')>0
select @sItem=replace(@sItem,N' ',N'|')while CHARINDEX(@sItem,N' |')>0
select @sItem=replace(@sItem,N' |',N'|')while CHARINDEX(@sItem,N'| ')>0
select @sItem=replace(@sItem,N'| ',N'|')declare @sql Nvarchar(4000)create table ##T (a NVarchar(400))select @sql=N'insert ##T values (N'''+replace(@sItem,'|',N''') insert ##T values (N''')+N''')'
exec (@sql)select * from ##T -----子串
select count(*) from ##T ----子串的個數未测试!!!!!
select @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'
while CHARINDEX(@sItem,N' ')>0
select @sItem=replace(@sItem,N' ',N'|')while CHARINDEX(@sItem,N' |')>0
select @sItem=replace(@sItem,N' |',N'|')while CHARINDEX(@sItem,N'| ')>0
select @sItem=replace(@sItem,N'| ',N'|')declare @sql Nvarchar(4000)create table ##T (a NVarchar(400))select @sql=N'insert ##T values (N'''+replace(@sItem,'|',N''') insert ##T values (N''')+N''')'
exec (@sql)select * from ##T -----子串
select count(*) from ##T ----子串的個數未测试!!!!!
:)
DECLARE @sItem NVARCHAR(400),@tmp1 NVARCHAR(400),@space nchar(10),@int int,@count int
begin
set nocount on
set @space = ' '
SET @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'
select @tmp1 = @sItem,@count = 0
while(len(@sItem) > 0 and @sItem is not null)
begin
select @int = charindex(@space,@sItem)
if @int > 0
begin
select @tmp1 = substring(@sItem,@int,400)
select '['+substring(@sItem,1,@int - 1)+']'
select @sItem = ltrim(@tmp1)
select @count = @count + 1
end
else
begin
select '['+@sItem+']'
select @sItem = ''
select @count = @count + 1
end
end
select @count
set nocount off
end
結果稍稍有錯。
declare @len int
declare @i int
declare @k int
declare @f int
SET @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'
set @len=len(@sItem)
set @i=1
set @k=0
set @f=1
while @len>=0
begin
--select 'kk'+substring(@sItem,@i,1)
if substring(@sItem,@i,1)=' '
set @k=@k+1
else
begin
if @k>=10 or @len=1
begin
select '['+rtrim(substring(@sItem,@f,@i-@f))+']'
set @k=0
set @f=@i
end
set @k=0
end
set @len=@len-1
set @i=@i+1
end
DECLARE @sItem NVARCHAR(400),@tmp1 NVARCHAR(400),@space nchar(10),@int int,@count int
begin
set nocount on
set @space = ' '
SET @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'
select @tmp1 = @sItem,@count = 0
--加上全空格异常处理
if @sItem = ''
return
while(len(@sItem) > 0 and @sItem is not null)
begin
select @int = charindex(@space,@sItem)
if @int > 0
begin
select @tmp1 = substring(@sItem,@int,400)
select '['+substring(@sItem,1,@int - 1)+']'
select @sItem = ltrim(@tmp1)
select @count = @count + 1
end
else
begin
select '['+@sItem+']'
select @sItem = ''
select @count = @count + 1
end
end
select @count
set nocount off
end
是結果有點不正確。你把 "最 好 的"分成兩個子串了,其實之間的空格數只有3個,不應該把它自分割。
create table aaa(str varchar(2000) not null)
下面是计算过程:
declare @tmp varchar(1000)
declare @strsql varchar(8000)
select @strsql=''
select @tmp=' Microsoft SQL Server 2000 最 好 的 RDBMS'
select @strsql='insert into aaa values (ltrim('''+
replace(replace(replace(@tmp,replicate(' ',10),'[]') ,'][',''),'[]',''')) insert into aaa values (ltrim(''')+
'''))'
exec (@strsql)
--print @strsql
select * from aaa
select count(*) from aaa
你的結果正確。
DECLARE @sItem NVARCHAR(400)
declare @len int
declare @i int
declare @k int
declare @f int
SET @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'
set @len=len(@sItem)
set @i=1
set @k=0
set @f=1
while @len>=0
begin
if substring(@sItem,@i,1)=' '
set @k=@k+1
else
begin
if @k>=10
begin
select '['+rtrim(substring(@sItem,@f,@i-@f))+']'
set @k=0
set @f=@i
end
if @len=1
select '['+rtrim(substring(@sItem,@f,@i-@f+2))+']'
set @k=0
end
set @len=@len-1
set @i=@i+1
end
結果有誤...
以下為SQL及計算結果:drop table aaa
create table aaa(sItem varchar(2000) not null)
set nocount on --下面是计算过程:
declare @tmp varchar(1000)
declare @strsql varchar(8000)
select @strsql=''
select @tmp=' Microsoft SQL Server 2000 最好 的 RDBMS'
select @strsql='insert into aaa values (ltrim('''+
replace(replace(replace(@tmp,replicate(' ',10),'[]') ,'][',''),'[]',''')) insert into aaa values (ltrim(''')+
'''))'
exec (@strsql)
--print @strsql
select * from aaa
select count(*) as Cnt from aaa結果為:sItem ----------------------------------------------------
Microsoft SQL Server 2000
最好 /*的字哪去了? */
RDBMSCnt
-----------
3
SET @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'set @tmp=REPLICATE(' ',10)
create table ##T1 (txt NVarchar(400))IF PATINDEX('%'+@tmp,@sItem)=0
SET @sItem='['+@sItem
IF PATINDEX(@tmp+'%',@sItem)=0
SET @sItem=@sItem+']'
set @tmp='%'+@tmp+'%'while PATINDEX(@tmp,@sItem)>0
BEGIN
SET @x=SUBSTRING(@sItem,1,PATINDEX(@tmp,@sItem))+']'
INSERT ##T1 VALUES(@x)
SET @sItem='['+LTRIM(RIGHT(@sItem,len(@sItem)-len(@x)))
END
IF LEN(@sItem)>1
INSERT ##T1 VALUES(@sItem)
SELECT txt FROM ##T1 COMPUTE COUNT(txt)drop table ##t1
declare @leftstring varchar(100)
SET @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'
declare @n intwhile (1=1)
begin
set @n=charindex(space(10),@sitem)
if @n>0
begin
set @leftstring=left(@sitem,@n)
set @sitem=right(@sitem,len(@sitem)-charindex(space(10),@sitem)-9)
end if @n=0
begin
print @sitem
break
end
if @n<>1
print @leftstringend
=============return
Microsoft SQL Server 2000
最 好 的
RDBMS
SET @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'set @tmp=REPLICATE(' ',10)
create table ##T1 (txt NVarchar(400))IF PATINDEX('%'+@tmp,@sItem)=0 SET @sItem='['+@sItem
IF PATINDEX(@tmp+'%',@sItem)=0 SET @sItem=@sItem+']'
set @tmp='%'+@tmp+'%'while PATINDEX(@tmp,@sItem)>0
BEGIN
SET @x=SUBSTRING(@sItem,1,PATINDEX(@tmp,@sItem))+']'
INSERT ##T1 VALUES(@x)
SET @sItem='['+LTRIM(RIGHT(@sItem,len(@sItem)-len(@x)-1))
END
IF LEN(@sItem)>1
INSERT ##T1 VALUES(@sItem)
SELECT txt FROM ##T1 COMPUTE COUNT(txt)drop table ##t1
SET @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'set @tmp=REPLICATE(' ',10)
create table ##T1 (txt NVarchar(400))IF PATINDEX('%'+@tmp,@sItem)=0 SET @sItem='['+@sItem
IF PATINDEX(@tmp+'%',@sItem)=0 SET @sItem=@sItem+']'
set @tmp='%'+@tmp+'%'while PATINDEX(@tmp,@sItem)>0
BEGIN
SET @x=RTRIM(SUBSTRING(@sItem,1,PATINDEX(@tmp,@sItem)))+']'
INSERT ##T1 VALUES(@x)
SET @sItem='['+LTRIM(RIGHT(@sItem,len(@sItem)-len(@x)))
END
IF LEN(@sItem)>1
INSERT ##T1 VALUES(@sItem)
SELECT txt FROM ##T1 COMPUTE COUNT(txt)
DECLARE @sItem NVARCHAR(400)
declare @leftstring varchar(100)
SET @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'
declare @n int
declare @m int
set @m=0
while (1=1)
begin
set @n=charindex(space(10),@sitem)
if @n>0
begin
set @leftstring=left(@sitem,@n)
set @sitem=right(@sitem,len(@sitem)-charindex(space(10),@sitem)-9)
end if @n=0
begin
print @sitem
set @m=@m+1
break
end
if @n<>1
begin
print @leftstring
set @m=@m+1
end
endselect @m/*==============return==============
Microsoft SQL Server 2000
最 好 的
RDBMS
-----------
3(所影响的行数为 1 行)*/
DECLARE @sItem NVARCHAR(400),@tmp nvarchar(30),@x nvarchar(400)
SET @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'set @tmp='%'+REPLICATE(' ',10)+'%'
create table ##T1 (txt NVarchar(400))
while PATINDEX(@tmp,@sItem)>0
BEGIN
SET @x='['+RTRIM(SUBSTRING(@sItem,1,PATINDEX(@tmp,@sItem)))+']'
INSERT ##T1 VALUES(@x)
SET @sItem=LTRIM(RIGHT(@sItem,len(@sItem)-len(@x)))
END
IF LEN(@sItem)>1
INSERT ##T1 VALUES('['+@sItem+']')
SELECT txt FROM ##T1 COMPUTE COUNT(txt)drop table ##t1
DECLARE @sItem NVARCHAR(400)
declare @leftstring varchar(100)
SET @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'
declare @n int
declare @m int
set @m=0
while (1=1)
begin
set @n=charindex(space(10),@sitem)
if @n>0
begin
set @leftstring=left(@sitem,@n)
set @sitem=rtrim(right(@sitem,len(@sitem)-charindex(space(10),@sitem)-9))
end
if @n=0
begin
print @sitem
set @m=@m+1
break
end
if @n<>1
begin
print @leftstring
set @m=@m+1
end
end
select @m
declare @leftstring varchar(100)
SET @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'
declare @n int
declare @m int
set @m=0
while (1=1)
begin
set @n=charindex(space(10),@sitem)
if @n>0
begin
set @leftstring=left(@sitem,@n)
set @sitem=ltrim(right(@sitem,len(@sitem)-charindex(space(10),@sitem)-9))
end
if @n=0
begin
print @sitem
set @m=@m+1
break
end
print @leftstring
set @m=@m+1
end
select @m
declare @leftstring varchar(100)
SET @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'
declare @n int
declare @m int
set @m=0
while (1=1)
begin
set @n=charindex(space(10),@sitem)
if @n>0
begin
set @leftstring=left(@sitem,@n)
set @sitem=ltrim(right(@sitem,len(@sitem)-charindex(space(10),@sitem)-9))
end
if @n=0
begin
print @sitem
set @m=@m+1
break
end
print @leftstring
set @m=@m+1
end
select @m
DECLARE @sItem NVARCHAR(400)
SET @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'SELECT @sItem=REPLACE(@sItem,' ',''',''' )
SELECT @sItem=''''+REPLACE(@sItem,' ',''',''' )+''''
EXEC('SELECT '+@sItem )
select @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'
while CHARINDEX(@sItem,N' ')>0
select @sItem=replace(N'['+@sItem+N']',N' ',N'][')while CHARINDEX(@sItem,N' ][')>0
select @sItem=replace(@sItem,N' ][',N'][')while CHARINDEX(@sItem,N'][ ')>0
select @sItem=replace(@sItem,N'][ ',N'][')declare @sql Nvarchar(4000)create table ##T (a NVarchar(400))select @sql=N'insert ##T values (N'''+replace(@sItem,N'][',N']'') insert ##T values (N''[')+N''')'
exec (@sql)select * from ##T -----子串
select count(*) from ##T ----子串的個數还是未测试!!!!!我没有了测试环境,飘香兄帮我测试一下。
select @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'
while CHARINDEX(@sItem,N' ')>0
select @sItem=replace(N'['+@sItem+N']',N' ',N'][')
while CHARINDEX(@sItem,N' ][')>0
select @sItem=replace(@sItem,N' ][',N'][')while CHARINDEX(@sItem,N'][ ')>0
select @sItem=replace(@sItem,N'][ ',N'][')while CHARINDEX(@sItem,N'][][')>0
select @sItem=replace(@sItem,N' ][][',N'][')declare @sql Nvarchar(4000)create table ##T (a NVarchar(400))select @sql=N'insert ##T values (N'''+replace(@sItem,N'][',N']'') insert ##T values (N''[')+N''')'
exec (@sql)select * from ##T -----子串
select count(*) from ##T ----子串的個數还是未测试!!!!!我没有了测试环境,飘香兄帮我测试一下。
select @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'
while CHARINDEX(@sItem,N' ')>0
select @sItem=replace(N'['+@sItem+N']',N' ',N'][')
while CHARINDEX(@sItem,N' ][')>0
select @sItem=replace(@sItem,N' ][',N'][')while CHARINDEX(@sItem,N'][ ')>0
select @sItem=replace(@sItem,N'][ ',N'][')while CHARINDEX(@sItem,N'][][')>0
select @sItem=replace(@sItem,N' ][][',N'][')declare @sql Nvarchar(4000)create table ##T (a NVarchar(400))select @sql=N'insert ##T values (N'''+replace(@sItem,N'][',N']'') insert ##T values (N''[')+N''')'
exec (@sql)select * from ##T
select count(*) as cnt from ##T ----子串的個數drop table ##T
仲還無得啊!
CHARINDEX是把要搜索的字串放在第一個參數,第二個參數是被搜索的對象。:)2 gzhughie(hughie) :
連續的空格數是不固定的,而且要的是得到子串。不是顯示的問題。
DECLARE @sItem NVARCHAR(400)
SET @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'DECLARE @I INT
DECLARE @S NVARCHAR(400)
DECLARE @S1 NVARCHAR(400)
CREATE TABLE #T (K NVARCHAR(400))
SELECT @S1=REPLACE(@sItem,' ',',' ),@I=1WHILE @I>-1
BEGIN
SELECT @I=CHARINDEX(',',@S1)
SELECT @S=CASE WHEN @I=0 THEN @S1 ELSE LEFT(@S1,@I-1) END,@S1=CASE WHEN @I>=LEN(@S1) THEN '' ELSE RIGHT(@S1,LEN(@S1)-@I) END
IF @S>''
INSERT INTO #T(K) VALUES(@S)
IF @I=0 SELECT @I=-1
END
SELECT * FROM #T
DROP TABLE #T
不可能的,我的代码肯定不会出这样的错误的,你在仔细运行一下,我这里毫无错误,不知道你是怎么测试出来这个错误的?
-------------------------------------------------------------
to xzou(亡狼补齿)
是結果有點不正確。你把 "最 好 的"分成兩個子串了,其實之間的空格數只有3個,不應該把它自分割。
select @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'
while CHARINDEX(@sItem,N' ')>0
select @sItem=replace(N'['+@sItem+N']',N' ',N'][')
while CHARINDEX(N' ][',@sItem)>0
select @sItem=replace(@sItem,N' ][',N'][')while CHARINDEX(N'][ ',@sItem)>0
select @sItem=replace(@sItem,N'][ ',N'][')while CHARINDEX(N'][][',@sItem)>0
select @sItem=replace(@sItem,N' ][][',N'][')declare @sql Nvarchar(4000)create table ##T (a NVarchar(400))select @sql=N'insert ##T values (N'''+replace(@sItem,N'][',N']'') insert ##T values (N''[')+N''')'
exec (@sql)select * from ##T
select count(*) as cnt from ##T ----子串的個數drop table ##T
還是咱們先把環境列出來看看。這問題太有趣了,剛剛跟按鈕JJ已經Check出SQL Server的一個"Bug"來了。 我的環境:
Windows 2K Server.
MS SQL Server 2000 (沒有裝任何補丁)以下是您的程式在我機器上Run出來的結果:
----------------------------------------------------
[ Microsoft SQL Server 2000]
----------------------------------------------------
[最 好 ]
---------------------------------------------------
[的]
---------------------------------------------------
[RDBMS]
-----------
4
declare @tmp nvarchar(2000)
select @tmp=N' Microsoft SQL Server 2000 最 好 的 RDBMS'
select replace(@tmp,replicate(' ',10),'[]')得到的结果是:
Microsoft SQL Server 2000[][] 最 好 []RDBMS这肯定是错的,但我觉得不是我的问题,不知道MSSQL为什么会把“的”字替换掉,我觉得是MSSQL的BUG,有兴趣的朋友可以用你们的版本试一下。至少目前我和飘香都发现这个问题了。
噢,你以改好了!.....不对!你的语句会死循环!
在这一句:while CHARINDEX(N'][][',@sItem)>0
select @sItem=replace(@sItem,N' ][][',N'][')
==========================*/DECLARE @sItem NVARCHAR(400)select @sItem=' Microsoft SQL Server 2000 最 好 的 RDBMS'
while CHARINDEX(N' ',@sItem)>0
select @sItem=replace(N'['+@sItem+N']',N' ',N'][')
while CHARINDEX(N' ][',@sItem)>0
select @sItem=replace(@sItem,N' ][',N'][')while CHARINDEX(N'][ ',@sItem)>0
select @sItem=replace(@sItem,N'][ ',N'][')while CHARINDEX(N'][][',@sItem)>0 select @sItem=replace(@sItem,N'][][',N'][')declare @sql Nvarchar(4000)create table ##T (a NVarchar(400))select @sql=N'insert ##T values (N'''+replace(@sItem,N'][',N']'') insert ##T values (N''[')+N''')'
exec (@sql)select * from ##T
select count(*) as cnt from ##T ----子串的個數drop table ##T
Microsoft SQL Server 2000
最 好 /* 的字跑到哪去了?!!!*/
RDBMS
还有就是是不是用len()算出来具体的字符串长度有助于提高速度?
我的环境是:
win2000 server sp2
sql server2000 sp2
海兄,j9988(j9988) :
下面是你們的SQL在我電腦上的結果:("的”字同樣不見了!!)a
------------------------------------------------
[ Microsoft SQL Server 2000]
[最 好]
[RDBMS]cnt
-----------
3