T-SQL'de Numaraları Biçimlendirmek İçin Numaraları ve Dizeleri Nasıl Birleştirilir?


105

Aşağıdaki işleve sahibim

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

ancak onu kullanmaya çalıştığımda şu hatayı aldım "'x' varchar değerini int veri türüne dönüştürürken dönüştürme başarısız oldu." aşağıdaki select ifadesini kullandığımda

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

Yapmak istediğim şey, Gerçek Ağırlık boş değilse, "Gerçek Ağırlık / DIMS" için Gerçek Ağırlığı döndürmek veya Gerçek_Dims_Lenght, Genişlik ve Yükseklik'i kullanmaktır.

DIMS ise, çıktıyı LenghtxWidhtxHeight (15x10x4) olarak biçimlendirmek istiyorum. Gerçek Ağırlık, Adcutal_Dims_Lenght, Genişlik ve Yükseklik tüm int (tamsayı) değeridir ancak "Gerçek Ağırlık / DIMS" çıktısı varchar (50) olmalıdır.

Nerede yanlış anlıyorum?

teşekkür

düzenleme: Kullanıcı ASP.net sayfasında yalnızca Ağırlık veya DIMS seçebilir ve kullanıcı DIMS'i seçtiyse, Uzunluk, Genişlik ve Yükseklik sağlamaları gerekir. Aksi takdirde ASP.net sayfasında hata atacaktır. Sql tarafında endişelenmeli miyim?

Yanıtlar:


211

Birkaç hızlı not:

  • "Uzunluk" değil "uzunluk"
  • Sorgunuzdaki tablo takma adları muhtemelen onu çok daha okunaklı hale getirecektir

Şimdi soruna gelelim ...

Parametrelerinizi birleştirmeye çalışmadan önce açıkça VARCHAR'a dönüştürmeniz gerekir. SQL Server @my_int + 'X' gördüğünde, @my_int'e "X" sayısını eklemeye çalıştığınızı düşünür ve bunu yapamaz. Bunun yerine şunu deneyin:

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
Her zaman bir varchar uzunluğunu belirtmelisiniz: sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/…
— Eugene Ryabtsev

Teşekkürler. Biraz geç ama uzunluk parametrelerini ekledim.
— Tom H

53

SQL Server 2012+ kullanıyorsanız , herhangi bir açık dönüştürme yapmamız gerekmeyen CONCAT işlevini kullanabilirsiniz.

SET @ActualWeightDIMS = Concat(@Actual_Dims_Lenght, 'x', @Actual_Dims_Width, 'x' 
                        , @Actual_Dims_Height) 

Daha CONCAT()hızlı performans gösteren bazı iddialarla karşılaştım CAST(). Güvenilir performans çalışmaları kaynakları faydalı olacaktır.
— Çekiçli Kodlar

Bir karşılaştırmada ölçülebilir olsaydı şaşırmazdım, ancak normal sorgularda herhangi bir etki yaratırsa çok şaşırırdım. Normal çalışma süresini bastırmak için muazzam sayıda alçıya sahip olmanız gerekir.
— SilverbackNet

8

Bunu değiştir:

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

Buna:

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

Bunu değiştir:

SET @ActualWeightDIMS = @ActualWeight;

Buna:

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

CAST kullanmanız gerekiyor. CAST ve CONVERT hakkında her şeyi buradan öğrenin , çünkü veri türleri önemlidir!



4

Tam sayılarınızı bir varchar'a birleştirmeye çalışırken dizge olarak çevirmelisiniz.

yani

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

SQL Server 2008'de şu STRişlevi kullanabilirsiniz :

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

2
STR işlevi varsayılan olarak sayıyı 10 karaktere doldurur, böylece çok sayıda boşluk ekler. örneğin STR(1)bana 9 boşluk ve ardından geliyor 1. CASTaslında daha iyi çalışıyor.
— Tahir Hassan

2

Önce tam sayıları varchar'a çevirin!


Kesinlikle. 'X' dizesi anlamsız int decl'leri tamamen sıkıştırır; UDF'de aritmetik yoktur.
— bvj

2

Dize birleştirme yapmadan önce sayısal verilerinizi dizelere CAST yapmanız gerekir, bu nedenle örneğin CAST(@Actual_Dims_Lenght AS VARCHAR)sadece @Actual_Dims_Lenght& c yerine kullanın .


2

Aşağıdaki sorgu denedim, benim için tam olarak çalışıyor

 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

1

Girişleri bir dizeye eklemeden önce varchar'a dönüştürmeyi deneyin:

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

Tamsayıyı Str'ye dönüştürdüğünüzde Bilimsel Sayı elde etme olasılığınız vardır ... daha güvenli bir yoldur

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.