Sql-Server

REPLACE 和 CONVERT 的結果是 VARCHAR(8000) - 我怎樣才能得到 VARCHAR(50) 作為結果?

  • September 18, 2019

我有很多情況需要將具有許多小數位的大浮點數轉換為具有 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

在此處輸入圖像描述

現在我將進行轉換並將它們全部保存到臨時表中,然後我們將查看臨時表的結構。

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

在此處輸入圖像描述

一切都很好,效果很好,它完成了我想要的,但是,當我查看表格的結構時,我得到以下資訊:

use tempdb
go

sp_help '#radhe'

在此處輸入圖像描述

您可以在圖片上看到 varchar(8000)。我們可以避免嗎?

我會很高興有一個 varchar(50)

從上的文件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;

引用自:https://dba.stackexchange.com/questions/160744