如何在T-SQL中将数字和字符串连接成格式化数字?

Jac*_*ack 95 sql t-sql

我有以下功能

ALTER FUNCTION [dbo].[ActualWeightDIMS]
(
    -- Add the parameters for the function here
    @ActualWeight int,
    @Actual_Dims_Lenght int,
    @Actual_Dims_Width int,
    @Actual_Dims_Height int
)
RETURNS varchar(50)
AS
BEGIN

DECLARE @ActualWeightDIMS varchar(50);
--Actual Weight
     IF (@ActualWeight is not null) 
          SET @ActualWeightDIMS = @ActualWeight;
--Actual DIMS
     IF (@Actual_Dims_Lenght is not null) AND 
          (@Actual_Dims_Width is not null) AND (@Actual_Dims_Height is not null)
          SET @ActualWeightDIMS= @Actual_Dims_Lenght + 'x' + @Actual_Dims_Width + 'x' + @Actual_Dims_Height;


     RETURN(@ActualWeightDIMS);

END
Run Code Online (Sandbox Code Playgroud)

但当我尝试使用它时,我收到以下错误"将varchar值'x'转换为数据类型int时转换失败." 当我使用以下select语句时

select 
 BA_Adjustment_Detail.ID_Number [ID_Number],
 BA_Adjustment_Detail.Submit_Date [Submit_Date],
 BA_Category.Category [category],
 BA_Type_Of_Request.Request [Type_Of_Request],
 dbo.ActualWeightDIMS(BA_Adjustment_Detail.ActualWeight,BA_Adjustment_Detail.Actual_Dims_Lenght,BA_Adjustment_Detail.Actual_Dims_Width,BA_Adjustment_Detail.Actual_Dims_Height) [Actual Weight/DIMS],
 BA_Adjustment_Detail.Notes [Notes],
 BA_Adjustment_Detail.UPSCustomerNo [UPSNo],
 BA_Adjustment_Detail.TrackingNo [AirbillNo],
 BA_Adjustment_Detail.StoreNo [StoreNo],
 BA_Adjustment_Detail.Download_Date [Download_Date],
 BA_Adjustment_Detail.Shipment_Date[ShipmentDate],
 BA_Adjustment_Detail.FranchiseNo [FranchiseNo],
 BA_Adjustment_Detail.CustomerNo [CustomerNo],
 BA_Adjustment_Detail.BillTo [BillTo],
 BA_Adjustment_Detail.Adjustment_Amount_Requested [Adjustment_Amount_Requested]
from BA_Adjustment_Detail
inner join BA_Category 
on BA_Category.ID = BA_Adjustment_Detail.CategoryID
inner join BA_Type_Of_Request
on BA_Type_Of_Request.ID = BA_Adjustment_Detail.TypeOfRequestID
Run Code Online (Sandbox Code Playgroud)

我想要做的是,如果ActualWeight不为null,则返回ActualWeight为"Actual Weight/DIMS",否则使用Actual_Dims_Lenght,Width和Height.

如果是DIMS,那么我想将输出格式化为LenghtxWidhtxHeight(15x10x4).ActualWeight,Adcutal_Dims_Lenght,Width和Height都是int(整数)值,但"Actual Weight/DIMS"的输出应为varchar(50).

我在哪里弄错了?

谢谢

编辑:用户只能在ASP.net页面上选择Weight或DIMS,如果用户选择了DIMS,那么他们必须提供Length,Width和Height.否则它将在ASP.net页面上抛出错误.我应该在sql方面担心吗?

Tom*_*m H 195

几个快速笔记:

  • 它的"长度"不是"长度"
  • 查询中的表别名可能会使其更具可读性

现在解决问题......

在尝试连接它们之前,需要将参数显式转换为VARCHAR.当SQL Server看到@my_int +'X'时,它认为您正在尝试将数字"X"添加到@my_int,但它无法执行此操作.而是尝试:

SET @ActualWeightDIMS =
     CAST(@Actual_Dims_Lenght AS VARCHAR(16)) + 'x' +
     CAST(@Actual_Dims_Width  AS VARCHAR(16)) + 'x' +
     CAST(@Actual_Dims_Height  AS VARCHAR(16))
Run Code Online (Sandbox Code Playgroud)

  • 您应该始终指定varchar的长度:http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx (6认同)

Pரத*_*ீப் 47

如果您使用的是SQL Server 2012+,则可以使用CONCAT函数,我们无需进行任何显式转换

SET @ActualWeightDIMS = Concat(@Actual_Dims_Lenght, 'x', @Actual_Dims_Width, 'x' 
                        , @Actual_Dims_Height) 
Run Code Online (Sandbox Code Playgroud)


Eri*_*ric 8

改变这个:

SET @ActualWeightDIMS= @Actual_Dims_Lenght + 'x' + 
    @Actual_Dims_Width + 'x' + @Actual_Dims_Height;
Run Code Online (Sandbox Code Playgroud)

对此:

SET @ActualWeightDIMS= CAST(@Actual_Dims_Lenght as varchar(3)) + 'x' + 
    CAST(@Actual_Dims_Width as varchar(3)) + 'x' + 
    CAST(@Actual_Dims_Height as varchar(3));
Run Code Online (Sandbox Code Playgroud)

改变这个:

SET @ActualWeightDIMS = @ActualWeight;
Run Code Online (Sandbox Code Playgroud)

对此:

SET @ActualWeightDIMS = CAST(@ActualWeight as varchar(50));
Run Code Online (Sandbox Code Playgroud)

您需要使用CAST.在这里了解CAST和CONVERT的所有内容,因为数据类型很重要!


Sac*_*ant 7

select 'abcd' + ltrim(str(1)) + ltrim(str(2))
Run Code Online (Sandbox Code Playgroud)

  • 我不明白这是如何解决这个问题的. (6认同)