在CASE语句中的SQL Server中将varchar转换为数字错误时出错

时间:2017-08-16 15:37:10

标签: sql sql-server sql-server-2008

我有这个SQL:

DECLARE @HTMLROWSSingle NVARCHAR(MAX)
DECLARE @UnrecoveredPercentageOfTotalContract decimal(18,2)
DECLARE @ContractTerm NVARCHAR(20)

SET @ContractTerm = 2
SET @UnrecoveredPercentageOfTotalContract = 1

SET @HTMLROWSSingle  = '<tr>' + CASE WHEN @ContractTerm = 2
                                   THEN @UnrecoveredPercentageOfTotalContract  * .50 
                                   ELSE 1 
                                END + '</tr>'

Select  @HTMLROWSSingle 

我收到错误:

  

将数据类型varchar转换为数字

时出错

如果我将SQL更改为

SET @HTMLROWSSingle = CASE WHEN @ContractTerm = 2
                         THEN @UnrecoveredPercentageOfTotalContract * .50  
                         ELSE 1 
                      END

我能够获取数据。我不确定我在这里做错了什么。

这是小提琴http://sqlfiddle.com/#!6/ca0ba/2836

由于

4 个答案:

答案 0 :(得分:3)

您正在尝试将字符串与数字组合在一起。您还需要将数字转换为字符串。尝试

DECLARE @HTMLROWSSingle NVARCHAR(MAX)
DECLARE @UnrecoveredPercentageOfTotalContract decimal(18,2)
DECLARE @ContractTerm NVARCHAR(20)
SET @ContractTerm = 2
SET  @UnrecoveredPercentageOfTotalContract = 1

SET @HTMLROWSSingle  = '<tr>'+ CAST(Case When @ContractTerm = 2
          Then 
         @UnrecoveredPercentageOfTotalContract  * .50 Else 1 End as nvarchar(50)) +
         '</tr>'

Select  @HTMLROWSSingle 

答案 1 :(得分:3)

使用某些计算时,应始终使用正确的数据类型。在这种情况下,您尝试直接将字符串与十进制值连接,从而获得转换错误。 你应该使用这样的东西:

DECLARE @HTMLROWSSingle NVARCHAR(MAX);
DECLARE @UnrecoveredPercentageOfTotalContract decimal(18,2);
DECLARE @ContractTerm NVARCHAR(20);
SET @ContractTerm = N'2';
SET @UnrecoveredPercentageOfTotalContract = 1

SET @HTMLROWSSingle  = '<tr>'+ 
                        Case 
                            When @ContractTerm = N'2'
                            Then CONVERT(NVARCHAR(18),@UnrecoveredPercentageOfTotalContract*.50) 
                            Else N'1' 
                        End +'</tr>';

Select  @HTMLROWSSingle;

答案 2 :(得分:1)

您只需要将这些值转换为varchar/char,因为您正在尝试连接这些值:

DECLARE @HTMLROWSSingle NVARCHAR(MAX)
DECLARE @UnrecoveredPercentageOfTotalContract decimal(18,2)
DECLARE @ContractTerm NVARCHAR(20)
SET @ContractTerm = 2
SET  @UnrecoveredPercentageOfTotalContract = 1

SET @HTMLROWSSingle  = '<tr>'+ Case When @ContractTerm = 2 Then  cast(@UnrecoveredPercentageOfTotalContract  * .50 as nvarchar(10)) Else cast(1 as nvarchar(1)) End + '</tr>'

Select  @HTMLROWSSingle

答案 3 :(得分:0)

试试这个:

DECLARE @HTMLROWSSingle NVARCHAR(MAX)
DECLARE @UnrecoveredPercentageOfTotalContract decimal(18,2)
DECLARE @ContractTerm NVARCHAR(20)
SET @ContractTerm = '2'
SET  @UnrecoveredPercentageOfTotalContract = 1


SET @HTMLROWSSingle  = '<tr>' +  
        CASE 
            WHEN @ContractTerm = '2'
        Then 
         TRY_CONVERT(VARCHAR(MAX), @UnrecoveredPercentageOfTotalContract  * .50 )
         ELSE TRY_CONVERT(VARCHAR(2),1)
         END + '</tr>'

Select  @HTMLROWSSingle