texto - concatenar variables en sql
Cómo concatenar números y cadenas para formatear números en T-SQL? (10)
¡Lanza los enteros a varchar primero!
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 traté de usarlo, recibí el siguiente error "La conversión falló al convertir el valor varchar ''x'' al tipo de datos int". cuando uso la siguiente instrucción 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
Lo que quiero hacer es si el Peso real no es nulo y luego devolver el peso real para el "Peso real / DIMS" o bien utilizar el real_Dims_Lenght, ancho y alto.
Si es DIMS, entonces quiero formatear la salida para que sea LenghtxWidhtxHeight (15x10x4). The ActualWeight, Adcutal_Dims_Lenght, Width y Height son todos valores int (integer) pero la salida para "Weight / DIMS real" debe ser varchar (50).
¿Dónde me estoy equivocando?
gracias
editar: el usuario solo puede elegir Weight o DIMS en la página de ASP.net y, si el usuario seleccionó DIMS, debe proporcionar Length, Width y Height. De lo contrario arrojará un error en la página de ASP.net. ¿Debería preocuparme por eso en el lado sql?
Cambia esto:
SET @ActualWeightDIMS= @Actual_Dims_Lenght + ''x'' +
@Actual_Dims_Width + ''x'' + @Actual_Dims_Height;
A esto:
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));
Cambia esto:
SET @ActualWeightDIMS = @ActualWeight;
A esto:
SET @ActualWeightDIMS = CAST(@ActualWeight as varchar(50));
Necesitas usar CAST. Aprenda todo sobre CAST y CONVERT here , ¡porque los tipos de datos son importantes!
Debes convertir tus enteros en una cadena cuando trates de concatenarlos en varchar.
es decir
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));
En SQL Server 2008, puede usar la función STR
:
SELECT @ActualWeightDIMS = STR(@Actual_Dims_Lenght)
+ ''x'' + STR(@Actual_Dims_Width)
+ ''x'' + STR(@Actual_Dims_Height);
Hay posibilidades de que termine con Número científico cuando convierta Integer en Str ... se usa una forma más segura
SET @ActualWeightDIMS = STR(@Actual_Dims_Width); OR Select STR(@Actual_Dims_Width) + str(@Actual_Dims_Width)
Me probaron la siguiente consulta, me funciona exactamente
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
Necesita CASTAR sus datos numéricos a cadenas antes de realizar la concatenación de cadenas, por ejemplo, use CAST(@Actual_Dims_Lenght AS VARCHAR)
lugar de solo @Actual_Dims_Lenght
, & c.
Pruebe a enviar los ints a varchar, antes de agregarlos a una cadena:
SET @ActualWeightDIMS = cast(@Actual_Dims_Lenght as varchar(8)) +
''x'' + cast(@Actual_Dims_Width as varchar(8)) +
''x'' + cast(@Actual_Dims_Height as varhcar(8))
Si está utilizando SQL Server 2012+ puede usar la función CONCAT en la que no tenemos que hacer ninguna conversión explícita
SET @ActualWeightDIMS = Concat(@Actual_Dims_Lenght, ''x'', @Actual_Dims_Width, ''x''
, @Actual_Dims_Height)
Un par de notas rápidas:
- Es "longitud" no "longitud"
- Los alias de tabla en su consulta probablemente lo harían mucho más legible
Ahora en el problema ...
Necesita convertir explícitamente sus parámetros a VARCHAR antes de tratar de concatenarlos. Cuando SQL Server ve @my_int + ''X'' cree que está intentando agregar el número "X" a @my_int y no puede hacer eso. En cambio, intente:
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))
select ''abcd'' + ltrim(str(1)) + ltrim(str(2))