Eu tenho a seguinte função
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
mas quando tentei usá-lo, recebi o seguinte erro "A conversão falhou ao converter o valor varchar 'x' para o tipo de dados int." quando eu uso a seguinte declaração 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
O que eu quero fazer é se o ActualWeight não for nulo, retornar o ActualWeight para o "Peso real / DIMS" ou usar o Actual_Dims_Lenght, Width e Height.
Se for DIMS, quero formatar a saída como LenghtxWidhtxHeight (15x10x4). O ActualWeight, Adcutal_Dims_Lenght, Width e Height são todos valores int (integer), mas a saída para "Actual Weight / DIMS" deve ser varchar (50).
Onde eu estou entendendo errado?
obrigado
editar: O usuário só pode escolher Peso ou DIMS na página ASP.net e se o usuário selecionou DIMS, ele deve fornecer Comprimento, Largura e Altura. Caso contrário, ele lançará um erro na página ASP.net. Devo me preocupar com isso no lado do sql?
Se você estiver usando o SQL Server 2012+, você pode usar a função CONCAT , na qual não temos que fazer nenhuma conversão explícita
fonte
CONCAT()
desempenho mais rápido do queCAST()
. Fontes confiáveis de estudos de desempenho seriam úteis.Mude isso:
Para isso:
Mude isso:
Para isso:
Você precisa usar CAST. Aprenda tudo sobre CAST e CONVERT aqui , porque os tipos de dados são importantes!
fonte
fonte
Você deve converter seus inteiros como string ao tentar concatená-los em um varchar.
ie
No SQL Server 2008, você pode usar a
STR
função:fonte
STR(1)
dá-me 9 espaços seguidos de1
.CAST
realmente funciona melhor.Converta os inteiros para varchar primeiro!
fonte
Você precisa CAST seus dados numéricos para strings antes de fazer a concatenação de strings, então, por exemplo, use em
CAST(@Actual_Dims_Lenght AS VARCHAR)
vez de apenas@Actual_Dims_Lenght
, & c.fonte
Eu tentei a consulta abaixo e funciona exatamente para mim
fonte
Tente converter os ints em varchar, antes de adicioná-los a uma string:
fonte
Há chances de que você possa acabar com o número científico ao converter Inteiro em Str ... a maneira mais segura é
SET @ActualWeightDIMS = STR(@Actual_Dims_Width); OR Select STR(@Actual_Dims_Width) + str(@Actual_Dims_Width)
fonte