1. ホーム
  2. sql

[解決済み] T-SQLで数字と文字列を結合して数字をフォーマットするには?

2022-05-15 16:47:31

質問

次のような関数があります。

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がNULLでない場合、"実際の重量/DIMS"のActualWeightを返すか、さもなければActual_Dims_Lenght、幅、高さを使用することです。

DIMSであれば、LenghtxWidhtxHeight (15x10x4)になるように出力をフォーマットしたいです。ActualWeight、Adcutal_Dims_Lenght、Width、Heightはすべてint(整数)値ですが、"Actual Weight/DIMS" の出力はvarchar(50)である必要があります。

どこを間違えているのでしょうか?

感謝

edit: ASP.netのページでは、ユーザーはWeightかDIMSのどちらかしか選ぶことができず、DIMSを選んだ場合は、長さ、幅、高さを指定しなければなりません。そうでなければ、ASP.netのページでエラーが発生します。SQL側でそれを心配する必要がありますか?

どのように解決するには?

簡単なメモをいくつか。

  • それは "length" であり、 "lenght" ではありません。
  • クエリにテーブルのエイリアスを使用すると、おそらくもっと読みやすくなります。

さて、問題です...

パラメータを連結する前に、明示的に 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))