Bagaimana Menggabungkan Angka dan String untuk Memformat Angka di T-SQL?

105

Saya memiliki fungsi berikut

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

tetapi ketika saya mencoba menggunakannya, saya mendapat pesan kesalahan berikut "Konversi gagal saat mengonversi nilai varchar 'x' ke tipe data int." ketika saya menggunakan pernyataan pilih berikut

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

Yang ingin saya lakukan adalah jika ActualWeight tidak null maka kembalikan ActualWeight untuk "Actual Weight / DIMS" atau gunakan Actual_Dims_Lenght, Width dan Height.

Jika DIMS maka saya ingin memformat output menjadi LenghtxWidhtxHeight (15x10x4). ActualWeight, Adcutal_Dims_Lenght, Width dan Height semuanya adalah nilai int (integer) tetapi output untuk "Actual Weight / DIMS" harus varchar (50).

Di mana saya salah?

terima kasih

edit: Pengguna hanya dapat memilih salah satu Berat atau DIMS pada halaman ASP.net dan jika DIMS dipilih pengguna maka mereka harus menyediakan Panjang, Lebar dan Tinggi. Jika tidak, itu akan memunculkan kesalahan pada halaman ASP.net. Haruskah saya mengkhawatirkannya di sisi sql?

Mendongkrak
sumber

Jawaban:

211

Beberapa catatan singkat:

  • Ini "panjang" bukan "panjang"
  • Alias ​​tabel dalam kueri Anda mungkin akan membuatnya lebih mudah dibaca

Sekarang ke masalahnya ...

Anda perlu secara eksplisit mengonversi parameter Anda ke VARCHAR sebelum mencoba menggabungkannya. Ketika SQL Server melihat @my_int + 'X', ia mengira Anda mencoba menambahkan angka "X" ke @my_int dan tidak dapat melakukannya. Sebagai gantinya coba:

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))
Tom H.
sumber
6
Anda harus selalu menentukan panjang varchar: sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/…
Eugene Ryabtsev
Terima kasih. Agak terlambat, tetapi saya telah menambahkan parameter panjang.
Tom H
53

Jika Anda menggunakan SQL Server 2012+, Anda dapat menggunakan fungsi CONCAT di mana kami tidak perlu melakukan konversi eksplisit apa pun

SET @ActualWeightDIMS = Concat(@Actual_Dims_Lenght, 'x', @Actual_Dims_Width, 'x' 
                        , @Actual_Dims_Height) 
P ரதீப்
sumber
Saya telah menemukan beberapa klaim yang CONCAT()berkinerja lebih cepat dari CAST(). Sumber studi kinerja yang andal akan berguna.
Kode dengan Hammer
Saya tidak akan terkejut jika itu dapat diukur dalam tolok ukur, tetapi saya akan sangat terkejut jika hal itu berdampak pada kueri normal. Anda harus memiliki jumlah gips yang sangat banyak untuk mengurangi waktu pengoperasian normal.
SilverbackNet
8

Ubah ini:

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

Untuk ini:

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

Ubah ini:

SET @ActualWeightDIMS = @ActualWeight;

Untuk ini:

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

Anda perlu menggunakan CAST. Pelajari semua tentang CAST dan CONVERT di sini , karena tipe data itu penting!

Eric
sumber
6
select 'abcd' + ltrim(str(1)) + ltrim(str(2))
Sachin T Sawant
sumber
7
Saya tidak mengerti bagaimana ini menjawab pertanyaan.
Kode dengan Hammer
4

Anda harus mentransmisikan bilangan bulat Anda sebagai string saat mencoba menggabungkannya menjadi varchar.

yaitu

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

Di SQL Server 2008, Anda dapat menggunakan STRfungsi:

   SELECT  @ActualWeightDIMS = STR(@Actual_Dims_Lenght) 
                              + 'x' + STR(@Actual_Dims_Width) 
                              + 'x' + STR(@Actual_Dims_Height);
p. campbell
sumber
2
Fungsi STR secara default mengisi angka menjadi 10 karakter sehingga menambah banyak spasi. misalnya STR(1)memberi saya 9 spasi diikuti oleh 1. CASTsebenarnya bekerja lebih baik.
Tahir Hassan
2

Transmisikan bilangan bulat ke varchar terlebih dahulu!

John Saunders
sumber
Persis. String 'x' benar-benar menekan deklarasi int yang tidak berguna; tidak ada aritmatika di UDF.
bvj
2

Anda perlu melakukan CAST data numerik Anda ke string sebelum Anda melakukan penggabungan string, jadi misalnya gunakan CAST(@Actual_Dims_Lenght AS VARCHAR)bukan hanya @Actual_Dims_Lenght, & c.

Alex Martelli
sumber
2

Saya mencoba kueri di bawah ini, itu berfungsi untuk saya persis

 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
RickyRam
sumber
1

Cobalah mentransmisikan int ke varchar, sebelum menambahkannya ke string:

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))
Andomar
sumber
1

Ada kemungkinan Anda akan mendapatkan Angka Ilmiah ketika Anda mengubah Integer ke Str ... cara yang lebih aman adalah

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

singhswat
sumber