Tengo la siguiente función
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
pero cuando intenté usarlo, recibí el siguiente error "La conversión falló al convertir el valor varchar 'x' al tipo de datos int". cuando uso la siguiente declaración de selección
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
Lo que quiero hacer es si ActualWeight no es nulo, entonces devuelva el ActualWeight para el "Actual Weight / DIMS" o de lo contrario utilice Actual_Dims_Lenght, Width y Height.
Si es DIMS, entonces quiero formatear la salida para que sea LenghtxWidhtxHeight (15x10x4). ActualWeight, Adcutal_Dims_Lenght, Width y Height son todos valores int (enteros) pero la salida para "Actual Weight / DIMS" debe ser varchar (50).
¿Dónde me equivoco?
gracias
editar: El usuario solo puede elegir Peso o DIMS en la página ASP.net y si el usuario seleccionó DIMS, entonces debe proporcionar Largo, Ancho y Alto. De lo contrario, arrojará un error en la página ASP.net. ¿Debo preocuparme por eso en el lado de SQL?
Si está utilizando SQL Server 2012+ , puede usar la función CONCAT en la que no tenemos que hacer ninguna conversión explícita
fuente
CONCAT()
funcionan más rápido queCAST()
. Sería útil contar con fuentes confiables de estudios de desempeño.Cambia esto:
A esto:
Cambia esto:
A esto:
Necesita usar CAST. Aprenda todo sobre CAST y CONVERT aquí , ¡porque los tipos de datos son importantes!
fuente
fuente
Debes convertir tus enteros como una cadena cuando intentes concatenarlos en un varchar.
es decir
En SQL Server 2008, puede utilizar la
STR
función:fuente
STR(1)
me da 9 espacios seguidos de1
.CAST
en realidad funciona mejor.¡Lanza los enteros a varchar primero!
fuente
Necesita CAST sus datos numéricos a cadenas antes de hacer la concatenación de cadenas, por ejemplo, use en
CAST(@Actual_Dims_Lenght AS VARCHAR)
lugar de solo@Actual_Dims_Lenght
, & c.fuente
Probé la siguiente consulta, funciona exactamente para mí
fuente
Intente convertir los ints en varchar, antes de agregarlos a una cadena:
fuente
Hay posibilidades de que termines con un Número científico cuando conviertas Integer en Str ... una forma más segura es
SET @ActualWeightDIMS = STR(@Actual_Dims_Width); OR Select STR(@Actual_Dims_Width) + str(@Actual_Dims_Width)
fuente