create function f_lenb(@a varchar(500)) returns int as begin if len(@a)=0 return 0 declare @i int,@j int select @i=1,@j=len(@a)*2 while @i>=1 and @i<=@j begin if substring(convert(varbinary,@a),1,@i)=@a goto AA set @i=@i+1 end AA: return @i end -----------------------------------写了个函数 select dbo.f_lenb('我们a')--5
alter function f_lenb(@a varchar(500)) returns int as begin if len(isnull(@a,''))=0 return 0 declare @i int select @i=1 while @i>=1 begin if substring(convert(varbinary,@a),1,@i)=@a goto AA set @i=@i+1 end AA: return @i end --修饰下,注意右边的空格(包括全角空格)不被计算在内,所以右边要空格要作些修正
--想不到其它好办法只能再次修改 alter function f_lenb(@a varchar(500)) returns int as begin if len(isnull(@a,''))=0 return 0 declare @i int select @i=len(@a) while 1=1 begin if substring(convert(varbinary,@a),1,@i)=@a goto AA set @i=@i+1 end AA: return @i end
--提取英文 IF OBJECT_ID('DBO.GET_STR') IS NOT NULL DROP FUNCTION DBO.GET_STR GO CREATE FUNCTION DBO.GET_STR(@S VARCHAR(100)) RETURNS VARCHAR(100) AS BEGIN WHILE PATINDEX('%[^a-z]%',@S) > 0 BEGIN set @s=stuff(@s,patindex('%[^a-z]%',@s),1,'') END RETURN @S END go --提取中文 IF OBJECT_ID('DBO.CHINA_STR') IS NOT NULL DROP FUNCTION DBO.CHINA_STR GO CREATE FUNCTION DBO.CHINA_STR(@S NVARCHAR(100)) RETURNS VARCHAR(100) AS BEGIN WHILE PATINDEX('%[^吖-座]%',@S) > 0 SET @S = STUFF(@S,PATINDEX('%[^吖-座]%',@S),1,N'') RETURN @S END go declare @S varchar(3000) set @s='adfa1235ad好的' select len(DBO.GET_STR(@s)) select 2*len(DBO.CHINA_STR(@s))
--提取英文 IF OBJECT_ID('DBO.GET_STR') IS NOT NULL DROP FUNCTION DBO.GET_STR GO CREATE FUNCTION DBO.GET_STR(@S VARCHAR(100)) RETURNS VARCHAR(100) AS BEGIN WHILE PATINDEX('%[^a-z]%',@S) > 0 BEGIN set @s=stuff(@s,patindex('%[^a-z]%',@s),1,'') END RETURN @S END go 学习
谢谢各位大侠,方法我自己找到了,将我的解决方法贴出来给大家,一起学习 DATALENGTH(CAST(@STRTEMP AS VARCHAR(1000)) COLLATE CHINESE_PRC_BIN)-len(@STRTEMP),这样我就可以知道里面有多少个字符是点用两个字节的
select datalength('a你')
select len('a你')
begin
if len(@a)=0 return 0
declare @i int,@j int
select @i=1,@j=len(@a)*2
while @i>=1 and @i<=@j
begin
if substring(convert(varbinary,@a),1,@i)=@a
goto AA
set @i=@i+1
end
AA: return @i
end
-----------------------------------写了个函数
select dbo.f_lenb('我们a')--5
begin
if len(isnull(@a,''))=0 return 0
declare @i int
select @i=1
while @i>=1
begin
if substring(convert(varbinary,@a),1,@i)=@a
goto AA
set @i=@i+1
end
AA: return @i
end
--修饰下,注意右边的空格(包括全角空格)不被计算在内,所以右边要空格要作些修正
alter function f_lenb(@a varchar(500)) returns int as
begin
if len(isnull(@a,''))=0 return 0
declare @i int
select @i=len(@a)
while 1=1
begin
if substring(convert(varbinary,@a),1,@i)=@a
goto AA
set @i=@i+1
end
AA: return @i
end
IF OBJECT_ID('DBO.GET_STR') IS NOT NULL
DROP FUNCTION DBO.GET_STR
GO
CREATE FUNCTION DBO.GET_STR(@S VARCHAR(100))
RETURNS VARCHAR(100)
AS
BEGIN
WHILE PATINDEX('%[^a-z]%',@S) > 0
BEGIN
set @s=stuff(@s,patindex('%[^a-z]%',@s),1,'')
END
RETURN @S
END
go
--提取中文
IF OBJECT_ID('DBO.CHINA_STR') IS NOT NULL
DROP FUNCTION DBO.CHINA_STR
GO
CREATE FUNCTION DBO.CHINA_STR(@S NVARCHAR(100))
RETURNS VARCHAR(100)
AS
BEGIN
WHILE PATINDEX('%[^吖-座]%',@S) > 0
SET @S = STUFF(@S,PATINDEX('%[^吖-座]%',@S),1,N'')
RETURN @S
END
go
declare @S varchar(3000)
set @s='adfa1235ad好的'
select len(DBO.GET_STR(@s))
select 2*len(DBO.CHINA_STR(@s))
select datalength('s')
/*
-----------
2(所影响的行数为 1 行)
-----------
1(所影响的行数为 1 行)
*/
code=SQL]
select datalength('我')
select datalength('csdn')
[[/code]
IF OBJECT_ID('DBO.GET_STR') IS NOT NULL
DROP FUNCTION DBO.GET_STR
GO
CREATE FUNCTION DBO.GET_STR(@S VARCHAR(100))
RETURNS VARCHAR(100)
AS
BEGIN
WHILE PATINDEX('%[^a-z]%',@S) > 0
BEGIN
set @s=stuff(@s,patindex('%[^a-z]%',@s),1,'')
END
RETURN @S
END
go 学习
DATALENGTH(CAST(@STRTEMP AS VARCHAR(1000)) COLLATE CHINESE_PRC_BIN)-len(@STRTEMP),这样我就可以知道里面有多少个字符是点用两个字节的
select datalength('我')
select datalength('s')用这个函数