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.