【问题标题】:How to Concatenate Numbers and Strings to Format Numbers in T-SQL?如何连接数字和字符串以在 T-SQL 中格式化数字?
【发布时间】:2010-10-31 09:09:00
【问题描述】:

我有以下功能

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

但是当我尝试使用它时,我收到以下错误“将 varchar 值 'x' 转换为数据类型 int 时转换失败。”当我使用以下选择语句时

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

我想要做的是,如果 ActualWeight 不为空,则返回“ActualWeight/DIMS”的 ActualWeight,否则使用 Actual_Dims_Lenght、宽度和高度。

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

我哪里弄错了?

谢谢

编辑:用户只能在 ASP.net 页面上选择重量或 DIMS,如果用户选择了 DIMS,那么他们必须提供长度、宽度和高度。否则它将在 ASP.net 页面上引发错误。我应该在sql方面担心吗?

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    几个快速说明:

    • 这是“长度”而不是“长度”
    • 查询中的表别名可能会使其更具可读性

    现在问题来了……

    在尝试连接参数之前,您需要将参数显式转换为 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))
    

    【讨论】:

    【解决方案2】:

    如果您使用的是 SQL Server 2012+,您可以使用 CONCAT 函数,我们不必在其中进行任何显式转换

    SET @ActualWeightDIMS = Concat(@Actual_Dims_Lenght, 'x', @Actual_Dims_Width, 'x' 
                            , @Actual_Dims_Height) 
    

    【讨论】:

    • 我遇到了一些声称CONCAT() 的执行速度比CAST() 快​​的说法。性能研究的可靠来源会很有用。
    • 如果它可以在基准测试中衡量,我不会感到惊讶,但如果它对正常查询产生任何影响,我会感到非常惊讶。你必须有大量的演员才能淹没正常的工作时间。
    【解决方案3】:

    改变这个:

    SET @ActualWeightDIMS= @Actual_Dims_Lenght + 'x' + 
        @Actual_Dims_Width + 'x' + @Actual_Dims_Height;
    

    到这里:

    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));
    

    改变这个:

    SET @ActualWeightDIMS = @ActualWeight;
    

    到这里:

    SET @ActualWeightDIMS = CAST(@ActualWeight as varchar(50));
    

    您需要使用 CAST。全面了解 CAST 和 CONVERT here,因为数据类型很重要!

    【讨论】:

      【解决方案4】:
      select 'abcd' + ltrim(str(1)) + ltrim(str(2))
      

      【讨论】:

      • 我不明白这是如何解决这个问题的。
      【解决方案5】:

      在尝试将整数连接成 varchar 时,您必须将整数转换为字符串。

       SELECT  @ActualWeightDIMS = CAST(@Actual_Dims_Lenght AS varchar(10)) 
                                    + 'x' + 
                                   CAST(@Actual_Dims_Width as varchar(10)) 
                                   + 'x' + CAST(@Actual_Dims_Height as varchar(10));
      

      在 SQL Server 2008 中,您可以使用STR 函数:

         SELECT  @ActualWeightDIMS = STR(@Actual_Dims_Lenght) 
                                    + 'x' + STR(@Actual_Dims_Width) 
                                    + 'x' + STR(@Actual_Dims_Height);
      

      【讨论】:

      • STR 函数默认将数字填充为 10 个字符,因此会添加大量空格。例如STR(1) 给了我 9 个空格,然后是 1CAST 实际上效果更好。
      【解决方案6】:

      先将整数转换为 varchar!

      【讨论】:

      • 没错。字符串 'x' 完全敲击了无意义的 int decls; UDF 中没有算术。
      【解决方案7】:

      在进行字符串连接之前,您需要将数字数据转换为字符串,例如,使用 CAST(@Actual_Dims_Lenght AS VARCHAR) 而不仅仅是 @Actual_Dims_Lenght 等。

      【讨论】:

        【解决方案8】:

        我尝试了以下查询,它完全适合我

         with cte as(
        
           select ROW_NUMBER() over (order by repairid) as'RN', [RepairProductId] from [Ws_RepairList]
          )
          update CTE set [RepairProductId]= ISNULL([RepairProductId]+convert(nvarchar(10),RN),0) from cte
        

        【讨论】:

          【解决方案9】:

          在将整数添加到字符串之前,尝试将整数转换为 varchar:

          SET @ActualWeightDIMS = cast(@Actual_Dims_Lenght as varchar(8)) + 
             'x' + cast(@Actual_Dims_Width as varchar(8)) + 
             'x' + cast(@Actual_Dims_Height as varhcar(8))
          

          【讨论】:

            【解决方案10】:

            当您将 Integer 转换为 Str 时,您可能会以 Scientific Number 结尾.​​.....更安全的方法是

            SET @ActualWeightDIMS = STR(@Actual_Dims_Width); OR Select STR(@Actual_Dims_Width) + str(@Actual_Dims_Width)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-03-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-21
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多