2009-06-04 5 views
74

tengo la siguiente funciónCómo concatenar números y cadenas para formatear números en 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 

pero cuando traté de usarlo, tengo el siguiente error "Error de conversión al convertir el valor varchar 'x' al tipo de datos int." cuando se utiliza la siguiente instrucció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 el ActualWeight no es nulo, devolver el ActualWeight para el "peso real/DIMS" o bien utilizar el Actual_Dims_Lenght, anchura y altura.

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 equivoco?

agradecimiento

edición: El usuario sólo puede elegir cualquiera de peso o disminuye su brillo en la página ASP.net y si el usuario selecciona DIMS entonces debe suministrar longitud, anchura y altura. De lo contrario arrojará un error en la página de ASP.net. ¿Debería preocuparme por eso en el lado sql?

Respuesta

166

Un par de notas rápidas:

  • Se trata de "longitud" no "Longitud"
  • alias de tabla en la consulta probablemente sería hacer que sea mucho más fácil de leer

Ahora 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 lugar de tratar:

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)) 
+6

Siempre debe especificar la longitud de un varchar: http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx –

+0

Gracias . Un poco tarde, pero he agregado los parámetros de longitud. –

2

¡Primero arroje los enteros a varchar!

+0

Exactamente. La cadena 'x' martilla completamente las decls int sin sentido; no hay aritmética en el UDF. – bvj

5

cambiar esta situación:

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)); 

cambiar esta situación:

SET @ActualWeightDIMS = @ActualWeight; 

A esto:

SET @ActualWeightDIMS = CAST(@ActualWeight as varchar(50)); 

Necesita usar CAST. ¡Aprenda todo sobre CAST y CONVERTIR here, porque los tipos de datos son importantes!

4

Debe convertir sus enteros como una cadena al intentar 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 utilizar la función STR:

SELECT @ActualWeightDIMS = STR(@Actual_Dims_Lenght) 
           + 'x' + STR(@Actual_Dims_Width) 
           + 'x' + STR(@Actual_Dims_Height); 
+1

La función STR ajusta de forma predeterminada el número a 10 caracteres, por lo que agrega muchos espacios. p.ej. 'STR (1)' me da 9 espacios seguidos por '1'. 'CAST' en realidad funciona mejor. –

2

, es necesario especificar los datos numéricos en cadenas antes de hacer la concatenación de cadenas, así que por ejemplo el uso CAST(@Actual_Dims_Lenght AS VARCHAR) en lugar de solo @Actual_Dims_Lenght, & c.

0

Prueba a transmitir los enteros a varchar, antes de añadirlos 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)) 
1

estaba intentado la consulta por debajo de su obra para mí 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 
29

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) 
1

hay posibilidades de que usted podría terminar con Número Científica al convertir entero a STR ... manera más segura es

SET @ActualWeightDIMS = STR(@Actual_Dims_Width); OR Select STR(@Actual_Dims_Width) + str(@Actual_Dims_Width)

6
select 'abcd' + ltrim(str(1)) + ltrim(str(2)) 
Cuestiones relacionadas