USE tempdb GO IF OBJECT_ID('fn_Num') IS NOT NULL DROP FUNCTION fn_Num go CREATE FUNCTION fn_Num( @num DECIMAL(38,4) ) RETURNS NVARCHAR(50) AS begin DECLARE @s nvarchar(50),@split nvarchar(50),@i int SELECT @s=@num,@i=CHARINDEX('.',REVERSE(@s)),@Split=RIGHT(@s,@i),@s=LEFT(@s,LEN(@s)-@i),@i=3 WHILE LEN(@s)>3 SELECT @Split=','+RIGHT(@s,3)+@Split,@s=LEFT(@s,LEN(@s)-3) RETURN(@s+@Split) END GO SELECT dbo.fn_num(123456789.1230) /* 123,456,789.1230 */
--或直接指定參數為字符,不用再定義一個字符USE tempdb GO IF OBJECT_ID('fn_Num') IS NOT NULL DROP FUNCTION fn_Num go CREATE FUNCTION fn_Num( @s nvarchar(50) ) RETURNS NVARCHAR(50) AS begin DECLARE @split nvarchar(50),@i int SELECT @i=CHARINDEX('.',REVERSE(@s)),@Split=RIGHT(@s,@i),@s=LEFT(@s,LEN(@s)-@i),@i=3 WHILE LEN(@s)>3 SELECT @Split=','+RIGHT(@s,3)+@Split,@s=LEFT(@s,LEN(@s)-3) RETURN(@s+@Split) END GO SELECT dbo.fn_num(123456789.1230) /* 123,456,789.1230 */
123,456,789.12
declare @inputNumber nvarchar(30)
set @inputNumber='123246.456778'
--比如三位小数
--直接转成数字位数
SELECT CONVERT(NUMERIC(18,3),@inputNumber)
--SELECT CONVERT(MONEY,CONVERT(NUMERIC(18,1),@inputNumber))
--SELECT SUBSTRING('WONDER.abc',0,CHARINDEX('.','WONDER.abc'))
--再截取整数
select SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber))
,0
,charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
)
--截取小数部分
select SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber))
,charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))+1
,len(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))-charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
)
--将整数部分转成数字
select
CONVERT(money,SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber))
,0
,charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
),1)
--整数部分转成货币千分位
select
convert(nvarchar(30),
CONVERT(money,SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber))
,0
,charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
)),1)
----截取转成货币千分位后的整数部分
SELECT
SUBSTRING(convert(nvarchar(30),
CONVERT(money,SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber))
,0
,charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
)),1),0,
charindex('.',
convert(nvarchar(30),
CONVERT(money,SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber))
,0
,charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
)),1))
)--合并小数位
SELECT
SUBSTRING(convert(nvarchar(30),
CONVERT(money,SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber))
,0
,charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
)),1),0,
charindex('.',
convert(nvarchar(30),
CONVERT(money,SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber))
,0
,charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
)),1))
)
+'.'
+SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber))
,charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))+1
,len(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))-charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
)
分析完毕自己创建自定义函数 :--格式化数据为千分位等格式,比如:1245.56678,144,5.57
--参数:@inputNumbe输入字符,@floatCount小数位数,0,1,2,3,4
--时间:2011-04-13
ALTER function FormatNumeric(@inputNumber nvarchar(30) , @floatCount int)
RETURNS nvarchar(30)
AS
BEGIN
DECLARE @strTemp NVARCHAR(30)
--1个小数位
IF(@floatCount=1)
BEGIN
--测试数据
--declare @inputNumber nvarchar(30)
--set @inputNumber='123246.456'
--SELECT CONVERT(NUMERIC(18,1),@inputNumber)
--SELECT CONVERT(MONEY,CONVERT(NUMERIC(18,1),@inputNumber))
--SELECT CONVERT(NVARCHAR(30) , CONVERT(MONEY,CONVERT(NUMERIC(18,1),@inputNumber)) ,1) --SELECT charindex('.','156.23',0)
--SELECT charindex('.','123,246.50',0)+1
--SELECT SUBSTRING('123,246.50',1,charindex('.','123,246.50',0)+1)
SET @strTemp=
SUBSTRING(CONVERT(NVARCHAR(30) ,
CONVERT(MONEY,CONVERT(NUMERIC(18,1),@inputNumber)) ,1)
,1,
CHARINDEX('.',CONVERT(NVARCHAR(30) ,CONVERT(MONEY,CONVERT(NUMERIC(18,1),@inputNumber)) ,1),0)+1)
RETURN @strTemp
END
--2个小数位
IF(@FLOATcount=2)
BEGIN
--SELECT CONVERT(NVARCHAR(30) , CONVERT(MONEY,CONVERT(NUMERIC(18,2),@inputNumber)) ,1)
SET @strTemp=
SUBSTRING(CONVERT(NVARCHAR(30) ,
CONVERT(MONEY,CONVERT(NUMERIC(18,2),@inputNumber)) ,1)
,1,
CHARINDEX('.',CONVERT(NVARCHAR(30) ,CONVERT(MONEY,CONVERT(NUMERIC(18,2),@inputNumber)) ,1),0)+2)
RETURN @strTemp
END
--3.无小数
IF(@FLOATcount=0)
BEGIN
--SELECT CONVERT(NVARCHAR(30) , CONVERT(MONEY,CONVERT(NUMERIC(18,0),@inputNumber)) ,1)
SET @strTemp=
SUBSTRING(CONVERT(NVARCHAR(30) ,CONVERT(MONEY,CONVERT(NUMERIC(18,0),@inputNumber)) ,1)
,0,
CHARINDEX('.',CONVERT(NVARCHAR(30) ,CONVERT(MONEY,CONVERT(NUMERIC(18,0),@inputNumber)) ,1),0))
RETURN @strTemp
END
--默认位3位小数
ELSE
BEGIN
SET @strTemp=
SUBSTRING(convert(nvarchar(30),
CONVERT(money,SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber))
,0
,charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
)),1),0,
charindex('.',
convert(nvarchar(30),
CONVERT(money,SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber))
,0
,charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
)),1))
)
+'.'
+SUBSTRING(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber))
,charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))+1
,len(convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))-charindex('.',convert(nvarchar(30) ,CONVERT(NUMERIC(18,3),@inputNumber)))
)
END
return @strTemp
END
--SELECT dbo.FormatNumeric(Fld0055,2) from Pur0099
--SELECT dbo.FormatNumeric(Fld0055,1) from Pur0099
GO
IF OBJECT_ID('fn_Num') IS NOT NULL
DROP FUNCTION fn_Num
go
CREATE FUNCTION fn_Num(
@num DECIMAL(38,4)
)
RETURNS NVARCHAR(50)
AS
begin
DECLARE @s nvarchar(50),@split nvarchar(50),@i int
SELECT @s=@num,@i=CHARINDEX('.',REVERSE(@s)),@Split=RIGHT(@s,@i),@s=LEFT(@s,LEN(@s)-@i),@i=3
WHILE LEN(@s)>3
SELECT @Split=','+RIGHT(@s,3)+@Split,@s=LEFT(@s,LEN(@s)-3)
RETURN(@s+@Split)
END
GO
SELECT dbo.fn_num(123456789.1230)
/*
123,456,789.1230
*/
GO
IF OBJECT_ID('fn_Num') IS NOT NULL
DROP FUNCTION fn_Num
go
CREATE FUNCTION fn_Num(
@s nvarchar(50)
)
RETURNS NVARCHAR(50)
AS
begin
DECLARE @split nvarchar(50),@i int
SELECT @i=CHARINDEX('.',REVERSE(@s)),@Split=RIGHT(@s,@i),@s=LEFT(@s,LEN(@s)-@i),@i=3
WHILE LEN(@s)>3
SELECT @Split=','+RIGHT(@s,3)+@Split,@s=LEFT(@s,LEN(@s)-3)
RETURN(@s+@Split)
END
GO
SELECT dbo.fn_num(123456789.1230)
/*
123,456,789.1230
*/