วิธีการเชื่อมต่อตัวเลขและสตริงเพื่อจัดรูปแบบตัวเลขใน T-SQL


105

ฉันมีฟังก์ชั่นดังต่อไปนี้

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 สำหรับ "น้ำหนักจริง / DIMS" มิฉะนั้นให้ใช้ Actual_Dims_Lenght ความกว้างและความสูง

ถ้าเป็น DIMS ฉันต้องการฟอร์แมตผลลัพธ์เป็น LenghtxWidhtxHeight (15x10x4) น้ำหนักจริง Adcutal_Dims_Lenght ความกว้างและความสูงเป็นค่า int (จำนวนเต็ม) ทั้งหมด แต่ผลลัพธ์สำหรับ "น้ำหนักจริง / DIMS" ควรเป็น varchar (50)

ฉันเข้าใจผิดตรงไหน?

ขอบคุณ

แก้ไข: ผู้ใช้สามารถเลือกน้ำหนักหรือ DIMS ในหน้า ASP.net เท่านั้นและหากผู้ใช้เลือก DIMS ผู้ใช้จะต้องระบุความยาวความกว้างและความสูง มิฉะนั้นจะทำให้เกิดข้อผิดพลาดในหน้า ASP.net ฉันควรกังวลเกี่ยวกับเรื่องนี้ที่ด้าน sql หรือไม่?

คำตอบ:


211

บันทึกย่อสองสามข้อ:

  • มันคือ "ความยาว" ไม่ใช่ "ความยาว"
  • นามแฝงของตารางในแบบสอบถามของคุณอาจทำให้อ่านง่ายขึ้นมาก

ตอนนี้ปัญหา ...

คุณต้องแปลงพารามิเตอร์ของคุณเป็น 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))

6
คุณควรระบุความยาวของ varchar เสมอ
Eugene Ryabtsev

ขอบคุณ. ช้าไปหน่อย แต่ฉันได้เพิ่มพารามิเตอร์ความยาวแล้ว
Tom H

54

หากคุณใช้SQL Server 2012+คุณสามารถใช้ฟังก์ชันCONCATซึ่งเราไม่ต้องทำการแปลงใด ๆ อย่างชัดเจน

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

ฉันได้เจอบางคนอ้างว่าดำเนินการได้เร็วกว่าCONCAT() CAST()แหล่งที่มาของการศึกษาประสิทธิภาพที่เชื่อถือได้จะเป็นประโยชน์
รหัสกับ Hammer

ฉันจะไม่แปลกใจถ้ามันสามารถวัดผลได้ในเกณฑ์มาตรฐาน แต่ฉันจะแปลกใจมากถ้ามันส่งผลกระทบใด ๆ ในการสืบค้นปกติ คุณจะต้องมีการร่ายจำนวนมหาศาลเพื่อกลบเวลาการทำงานปกติ
SilverbackNet

8

เปลี่ยนสิ่งนี้:

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 เรียนรู้ทั้งหมดเกี่ยวกับแคสต์และแปลงที่นี่เนื่องจากประเภทข้อมูลมีความสำคัญ!



4

คุณต้องแคสจำนวนเต็มของคุณเป็นสตริงเมื่อพยายามเชื่อมต่อเข้ากับ 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);

2
ฟังก์ชัน STR ตามค่าเริ่มต้นจะเพิ่มจำนวนอักขระ 10 ตัวดังนั้นจึงเพิ่มช่องว่างมากมาย เช่นSTR(1)ให้ฉัน 9 1ช่องว่างตามมาด้วย CASTใช้งานได้ดีขึ้นจริง
Tahir Hassan


2

คุณต้องแคสต์ข้อมูลตัวเลขของคุณไปยังสตริงก่อนที่คุณจะทำการต่อสตริงดังนั้นตัวอย่างเช่นใช้CAST(@Actual_Dims_Lenght AS VARCHAR)แทนแค่@Actual_Dims_Lenght& c


2

ฉันได้ลองใช้แบบสอบถามด้านล่างแล้วมันใช้ได้กับฉันทุกประการ

 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

1

ลองแคสต์ ints เป็น 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))

1

มีโอกาสที่คุณจะลงเอยด้วย Scientific Number เมื่อคุณแปลง Integer เป็น Str ... วิธีที่ปลอดภัยกว่าคือ

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.