27,582
社区成员




--if object_id('dbo.CHINA_STR') is not null drop FUNCTION DBO.CHINA_STR
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'')
WHILE PATINDEX('%[a-Z]%',@S) > 0
SET @S=stuff(@S,patindex('%[a-Z]%',@S),1,'')
RETURN @S
END
GO
如果是第一种情况 直接
select sum( DBO.CHINA_STR(列名))
from T
就行了
如果是第二种情况
直接
select DBO.CHINA_STR(列名A)+ DBO.CHINA_STR(列名B)
如果是第三种情况
使用动态SQL
declare @sql varchar(8000)
set @sql=列名A
select @sql= 'select '+DBO.CHINA_STR(@sql)
exec(@sql)
USE test
go
if(object_id('tt')>0) drop table tt
create table TT
(
cardqty Nvarchar(40)
)
insert TT
select N'1个+2桶+3箱+4瓶+8托'
union select N'1个+2桶'
union select N'1+1'
union select N'2桶+1'
union select N'1+1桶'
--select * from tt
----- statement :
DECLARE @sql NVARCHAR(MAX)
SELECT @sql=ISNULL(@sql+' Union all ','')+'Select '+LTRIM(ROW_NUMBER()OVER(ORDER BY getdate()))+',N'''+cardqty+''',N'''+REPLACE(cardqty,'+',''' Union all Select '+LTRIM(ROW_NUMBER()OVER(ORDER BY getdate()))+',N'''+cardqty+''',N''')+'''' FROM TT
Exec (';With t(row,cardqty,cardqty2) As ('+@sql+') Select cardqty,Sum(Cast(Left(cardqty2,Patindex(''%[^0-9.]%'',cardqty2+''z'')-1) As Numeric(38,0))) As Result from t group by row,cardqty')
/*
cardqty Result
------------------- ---------
1+1 2
1+1桶 2
1个+2桶 3
1个+2桶+3箱+4瓶+8托 18
2桶+1 3
*/
if(object_id('tt')>0) drop table tt
create table TT
(
cardqty Nvarchar(40)
)
insert TT
select '1个+2桶+3箱+4瓶+8托'
union select '1个+2桶'
union select '1+1'
union select '2桶+1'
union select '1+1桶'
select * from TT
--建函數
create function f_getsum(@s nvarchar(100))
returns int
as
begin
declare @temp table(num int)
declare @sum int
declare @sz varchar(10)
set @sz=''
declare @i int
set @i=1
while(@s<>'')
begin
if patindex('%[0-9]%',substring(@s,@i,1))=1
set @sz=@sz+substring(@s,@i,1)
else if(@sz<>'')
begin
insert into @temp select @sz
set @sz=''
end
set @s=stuff(@s,@i,1,'')
end
if(@sz<>'')
insert into @temp select @sz
select @sum=sum(num) from @temp
return @sum
end
--調用
select dbo.f_getsum(cardqty) from TT
--建函數
create function f_getsum(@s nvarchar(100))
returns int
as
begin
declare @temp table(num int)
declare @sum int
declare @sz varchar(10)
set @sz=''
declare @i int
set @i=1
while(@s<>'')
begin
if patindex('%[0-9]%',substring(@s,@i,1))=1
set @sz=@sz+substring(@s,@i,1)
else if(@sz<>'')
begin
insert into @temp select @sz
set @sz=''
end
set @s=stuff(@s,@i,1,'')
end
if(@sz<>'')
insert into @temp select @sz
select @sum=sum(num) from @temp
return @sum
end
--測試
select dbo.f_getsum(num) from
(
select N'1箱+1箱' as num
union all select N'1箱+1箱+1箱+1箱' as num
union all select N'1個+10個+2個' as num
) as a
--結果
2
4
13
--结果
-----------
18
(1 行受影响)
declare @s varchar(50)
set @s='1个+2桶+3箱+4瓶+8托'
declare @i int
set @i=1
declare @sql varchar(100)
set @sql='select '
while(@s<>'')
begin
if patindex('%[0-9]%',substring(@s,@i,1))=1
set @sql=@sql+substring(@s,@i,1)+'+'
set @s=stuff(@s,@i,1,'')
end
set @sql=left(@sql,len(@sql)-1)
exec(@sql)
declare @s nvarchar(100)
set @s='1箱+1箱+1箱+1箱'
set @s=REPLACE(@s,right(@s,1),'')
set @s='select '+@s
exec(@s)