REPLACE 和 CONVERT 的结果是一个 VARCHAR(8000) - 我怎么能得到一个 VARCHAR(50) 作为结果呢?

Mar*_*lli 0 sql-server varchar type-conversion floating-point sql-server-2014

我有很多情况需要将带有许多小数位的大浮点数转换为带有 2、1 或根本没有小数位的四舍五入数字。

我一直在这样做的方式如下所示:

declare @t table ( [rows] float )


insert into @t 
select 1.344
union all select 32.3577
union all select 65.345
union all select 12.568
union all select 12.4333

select * from @t
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

现在我将进行转换并将它们全部保存到临时表中,然后我们将查看临时表的结构。

begin try
   drop table #radhe
end try
begin catch
end catch


select 
[Rows Formated] = REPLACE(CONVERT(VARCHAR(50),CAST(sp.[Rows] AS MONEY),1), '.00','')
into #radhe
from @t sp


select * 
from #radhe
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

一切都很好,效果很好,它做了我想要的,但是,当我查看表的结构时,我得到以下信息:

use tempdb
go

sp_help '#radhe'
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

您可以在图片上看到 varchar(8000)。我们可以避免吗?

我会很高兴使用 varchar(50)

Aar*_*and 5

从文档开始REPLACE()

如果 string_expression 不是varchar(max)nvarchar(max) 类型REPLACE则将返回值截断为 8,000 字节。要返回大于 8,000 字节的值,必须将string_expression显式转换为大值数据类型。

这对我来说意味着它总是varchar(8000)或者nvarchar(4000)当输入不是最大类型时。因此,尝试执行附加CONVERT REPLACE

SELECT 
  [Rows Formated] = CONVERT(varchar(50),REPLACE(CONVERT(varchar(50), 
    CAST(sp.[Rows] AS MONEY),1), '.00',''))
INTO #radhe
FROM @t AS sp;
Run Code Online (Sandbox Code Playgroud)