Как объединить числа и строки для форматирования чисел в 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
но когда я попытался использовать его, я получаю следующую ошибку "ошибка преобразования в тип varchar значение 'Х' В тип данных 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
что я хочу сделать, это если ActualWeight не равен нулю, то верните ActualWeight для "фактического веса / DIMS" или используйте Actual_Dims_Lenght, Width и Height.
если он тусклый, то я хочу отформатировать вывод быть LenghtxWidhtxHeight (15x10x4). ActualWeight, Adcutal_Dims_Lenght, Width и Height - это все значения int(integer), но выход для "фактического веса/DIMS" должен быть varchar (50).
где я получаю это неправильно?
спасибо
edit: пользователь может выбрать только вес или затемнения на ASP.net страница и если пользователь выбрал DIMS, то они должны предоставить длину, ширину и высоту. Иначе он будет бросать ошибку на ASP.net страница. Должен ли я беспокоиться об этом на стороне sql?
10 ответов:
несколько быстрых заметок:
- это "длина", а не "длина"
- псевдонимы таблиц в вашем запросе, вероятно, сделают его намного более читаемым
теперь о проблеме...
вы должны явно преобразовать свои параметры в 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))
Если вы используете SQL Server 2012+ можно использовать функция concat функция, в которой нам не нужно делать никаких явных преобразований
SET @ActualWeightDIMS = Concat(@Actual_Dims_Lenght, 'x', @Actual_Dims_Width, 'x' , @Actual_Dims_Height)
изменить это:
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 здесь, потому что типы данных важно!
вы должны привести свои целые числа в виде строки при попытке объединить их в 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);
вам нужно привести свои числовые данные в строки, прежде чем выполнять конкатенацию строк, поэтому, например, используйте просто
@Actual_Dims_Lenght
, &c.
Я пробовал ниже запроса, это работает для меня точно
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