Mam następującą funkcję
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
ale kiedy próbowałem go użyć, pojawił się następujący błąd: „Konwersja nie powiodła się podczas konwersji wartości varchar 'x' na typ danych int.” kiedy używam poniższej instrukcji 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
Chcę zrobić, jeśli ActualWeight nie jest zerowa, a następnie zwróć ActualWeight dla „Actual Weight / DIMS” lub użyj Actual_Dims_Lenght, Width i Height.
Jeśli jest to DIMS, chcę sformatować dane wyjściowe na LenghtxWidhtxHeight (15x10x4). ActualWeight, Adcutal_Dims_Lenght, Width i Height są wartościami int (integer), ale dane wyjściowe dla „Actual Weight / DIMS” powinny mieć wartość varchar (50).
Gdzie się mylę?
podziękować
edycja: użytkownik może wybrać tylko wagę lub wymiary na stronie ASP.net, a jeśli użytkownik wybrał DIMS, musi podać długość, szerokość i wysokość. W przeciwnym razie zgłosi błąd na stronie ASP.net. Czy powinienem się tym martwić po stronie sql?
Jeśli używasz SQL Server 2012+ , możesz użyć funkcji CONCAT, w której nie musimy wykonywać żadnej jawnej konwersji
źródło
CONCAT()
szybciej niżCAST()
. Przydatne byłyby wiarygodne źródła badań wydajności.Zmień to:
Do tego:
Zmień to:
Do tego:
Musisz użyć CAST. Dowiedz się wszystkiego o CAST i konwertować tutaj , ponieważ typy danych są ważne!
źródło
źródło
Musisz rzutować swoje liczby całkowite jako łańcuchy, gdy próbujesz połączyć je w varchar.
to znaczy
W SQL Server 2008 możesz użyć
STR
funkcji:źródło
STR(1)
daje mi 9 spacji, po których następuje1
.CAST
faktycznie działa lepiej.Najpierw przerzuć liczby całkowite na varchar!
źródło
Musisz przerzucić dane liczbowe na ciągi, zanim wykonasz konkatenację ciągów, więc na przykład użyj
CAST(@Actual_Dims_Lenght AS VARCHAR)
zamiast po prostu@Actual_Dims_Lenght
& c.źródło
Wypróbowałem poniższe zapytanie, które działa dokładnie dla mnie
źródło
Spróbuj rzutować ints na varchar, zanim dodasz je do łańcucha:
źródło
Są szanse, że możesz skończyć z liczbą naukową po przekonwertowaniu liczby całkowitej na str ... bezpieczniejszy sposób jest
SET @ActualWeightDIMS = STR(@Actual_Dims_Width); OR Select STR(@Actual_Dims_Width) + str(@Actual_Dims_Width)
źródło