У меня есть следующая функция
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» или использовать Actual_Dims_Lenght, Width и Height.
Если это DIMS, то я хочу отформатировать вывод как LenghtxWidhtxHeight (15x10x4). ActualWeight, Adcutal_Dims_Lenght, Width и Height - это целые (целые) значения, но вывод для «Фактический вес / DIMS» должен быть varchar (50).
Где я ошибаюсь?
благодарить
изменить: пользователь может выбрать только вес или DIMS на странице ASP.net, и если пользователь выбрал DIMS, они должны указать длину, ширину и высоту. В противном случае это вызовет ошибку на странице ASP.net. Стоит ли беспокоиться об этом на стороне sql?
Если вы используете SQL Server 2012+, вы можете использовать функцию CONCAT, в которой нам не нужно выполнять явное преобразование
источник
CONCAT()
быстрее, чемCAST()
. Были бы полезны надежные источники исследований производительности.Измените это:
К этому:
Измените это:
К этому:
Вам нужно использовать CAST. Узнайте все о CAST и CONVERT здесь , потому что типы данных важны!
источник
источник
Вы должны преобразовать свои целые числа как строку при попытке объединить их в varchar.
т.е.
В SQL Server 2008 вы можете использовать
STR
функцию:источник
STR(1)
дает мне 9 пробелов, за которыми следует1
.CAST
на самом деле работает лучше.Сначала преобразуйте целые числа в varchar!
источник
Вам нужно преобразовать числовые данные в строки, прежде чем выполнять конкатенацию строк, поэтому, например, используйте
CAST(@Actual_Dims_Lenght AS VARCHAR)
вместо просто@Actual_Dims_Lenght
& c.источник
Я попробовал следующий запрос, он работает для меня точно
источник
Попробуйте преобразовать целые числа в varchar, прежде чем добавлять их в строку:
источник
Есть вероятность, что вы получите научное число при преобразовании целого числа в Str ... более безопасный способ -
SET @ActualWeightDIMS = STR(@Actual_Dims_Width); OR Select STR(@Actual_Dims_Width) + str(@Actual_Dims_Width)
источник