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 eu l'erreur suivante "La conversion a échoué lors de la conversion de la valeur varchar 'x' en type de données int." quand 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 si le ActualWeight n'est pas nul, puis renvoyer le ActualWeight pour le "Actual Weight / DIMS" ou bien utiliser Actual_Dims_Lenght, Width et Height.
Si c'est DIMS, je veux formater la sortie pour qu'elle soit LenghtxWidhtxHeight (15x10x4). ActualWeight, Adcutal_Dims_Lenght, Width et Height sont tous des int (integer) mais la sortie pour "Actual Weight / DIMS" doit être varchar (50).
Où est-ce que je me trompe?
remercier
modifier: L'utilisateur ne peut choisir que Poids ou DIMS sur la page ASP.net et si l'utilisateur a sélectionné DIMS, il doit alors fournir Longueur, Largeur et Hauteur. Sinon, cela générera une erreur sur la page ASP.net. Dois-je m'en soucier du côté SQL?
Si vous utilisez SQL Server 2012+, vous pouvez utiliser la fonction CONCAT dans laquelle nous n'avons pas à effectuer de conversion explicite
la source
CONCAT()
fonctionnent plus rapidement queCAST()
. Des sources fiables d'études de performance seraient utiles.Change ça:
Pour ça:
Change ça:
Pour ça:
Vous devez utiliser CAST. Apprenez tout sur CAST et CONVERT ici , car les types de données sont importants!
la source
la source
Vous devez convertir vos entiers sous forme de chaîne lorsque vous essayez de les concaténer dans un varchar.
c'est à dire
Dans SQL Server 2008, vous pouvez utiliser la
STR
fonction:la source
STR(1)
me donne 9 espaces suivis de1
.CAST
fonctionne mieux.Convertissez d'abord les nombres entiers en varchar!
la source
Vous devez CAST vos données numériques en chaînes avant de faire la concaténation de chaînes, par exemple utilisez
CAST(@Actual_Dims_Lenght AS VARCHAR)
plutôt que juste@Actual_Dims_Lenght
, etc.la source
J'ai essayé la requête ci-dessous, cela fonctionne exactement pour moi
la source
Essayez de convertir les entiers en varchar, avant de les ajouter à une chaîne:
la source
Il y a des chances que vous vous retrouviez avec un numéro scientifique lorsque vous convertissez Integer en Str ... une manière plus sûre est
SET @ActualWeightDIMS = STR(@Actual_Dims_Width); OR Select STR(@Actual_Dims_Width) + str(@Actual_Dims_Width)
la source