102 votes

Comment concaténer des nombres et des chaînes pour mettre en forme des nombres dans T-SQL?

J'ai la fonction suivante

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

mais quand j'ai essayé de l'utiliser, j'ai obtenu l'erreur suivante: "échec de la Conversion lors de la conversion de la valeur varchar 'x' pour le type de données int." lorsque j'utilise l'instruction select suivante

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

Ce que je veux faire c'est que si le ActualWeight n'est pas null, alors le retour de la ActualWeight pour le "Poids Réel/s'ESTOMPE" ou alors utiliser la Actual_Dims_Lenght, la Largeur et la Hauteur.

Si c'est s'ESTOMPE alors je veux le format de la sortie de la LenghtxWidhtxHeight (15x10x4). Le ActualWeight, Adcutal_Dims_Lenght, la Largeur et la Hauteur sont toutes de type int (entier) de la valeur, mais la sortie de "Poids Réel/s'ESTOMPE" doit être de type varchar(50).

Où suis-je dans l'erreur?"

merci

modifier: L'utilisateur peut choisir soit le Poids ou ASSOMBRIT sur ASP.net page et si l'utilisateur a sélectionné s'ESTOMPE ensuite, ils doivent fournir la Longueur, la Largeur et la Hauteur. Reste qu'il va jeter erreur sur le ASP.net page. Dois-je m'inquiéter sur le sql?

204voto

Tom H. Points 23783

Quelques notes rapides:

  • C'est "longueur" pas "longueur"
  • Les alias de table dans votre requête le rendraient probablement beaucoup plus lisible

Maintenant sur le problème ...

Vous devez explicitement convertir vos paramètres en VARCHAR avant d'essayer de les concaténer. Lorsque SQL Server voit @my_int + 'X', il pense que vous essayez d'ajouter le nombre "X" à @my_int et qu'il ne peut pas le faire. Au lieu d'essayer:

 SET @ActualWeightDIMS =
     CAST(@Actual_Dims_Lenght AS VARCHAR) + 'x' +
     CAST(@Actual_Dims_Width  AS VARCHAR) + 'x' +
     CAST(@Actual_Dims_Height  AS VARCHAR)
 

8voto

Eric Points 35647

Change ça:

 SET @ActualWeightDIMS= @Actual_Dims_Lenght + 'x' + 
    @Actual_Dims_Width + 'x' + @Actual_Dims_Height;
 

Pour ça:

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

Change ça:

 SET @ActualWeightDIMS = @ActualWeight;
 

Pour ça:

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

Vous devez utiliser CAST. Apprenez tout sur CAST et CONVERT ici , car les types de données sont importants!

4voto

p.campbell Points 42771

Vous devez convertir vos entiers sous forme de chaîne lorsque vous essayez de les concaténer dans un varchar.

c'est à dire

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

Dans SQL Server 2008, vous pouvez utiliser la fonction STR :

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

2voto

John Saunders Points 118808

Jette les entiers à varchar en premier!

2voto

RickyRam Points 64

J'ai essayé la requête ci-dessous ça marche pour moi exactement

  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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X