टी-एसक्यूएल में संख्याओं और स्ट्रिंग्स को फॉर्मेट नंबरों में कैसे समाहित करें?


105

मेरा निम्नलिखित कार्य है

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

लेकिन जब मैंने इसका उपयोग करने की कोशिश की, तो मुझे निम्न त्रुटि मिली "डेटा प्रकार int के लिए varchar value 'x' को कनवर्ट करते समय रूपांतरण विफल रहा।" जब मैं निम्नलिखित चयन कथन का उपयोग करता हूं

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

मैं जो करना चाहता हूं वह है अगर एक्चुअल वाइट शून्य नहीं है तो "वेट वेट / डीआईएमएस" के लिए एक्चुअल वाइट को लौटा दें या फिर एक्चुअल_डिम_सुबह, चौड़ाई और ऊंचाई का उपयोग करें।

यदि यह डीआईएमएस है, तो मैं आउटपुट को लेन्ग्थक्सविडटएक्सहाइट (15x10x4) के रूप में प्रारूपित करना चाहता हूं। The RealWeight, Adcutal_Dims_Lenght, Width and Height सभी int (पूर्णांक) मान हैं, लेकिन "वास्तविक वजन / DIMS" के लिए आउटपुट varchar (50) होना चाहिए।

मैं कहाँ गलत हो रहा हूँ?

धन्यवाद

संपादित करें: उपयोगकर्ता ASP.net पेज पर केवल वजन या डीआईएमएस ले सकता है और यदि उपयोगकर्ता ने डीआईएमएस का चयन किया है, तो उन्हें लंबाई, चौड़ाई और ऊंचाई की आपूर्ति करनी चाहिए। अधिक यह ASP.net पृष्ठ पर त्रुटि फेंक देगा। क्या मुझे इसके बारे में चिंता करनी चाहिए?

जवाबों:


211

त्वरित नोटों की एक जोड़ी:

  • यह "लंबाई" नहीं "लम्पट" है
  • आपकी क्वेरी में टेबल उपनाम शायद इसे बहुत अधिक पठनीय बना देगा

अब समस्या पर ...

उन्हें स्पष्ट करने की कोशिश करने से पहले आपको अपने मापदंडों को VARCHAR में स्पष्ट रूप से परिवर्तित करना होगा। जब SQL सर्वर @my_int + 'X' देखता है, तो यह सोचता है कि आप "X" संख्या @my_int को जोड़ने का प्रयास कर रहे हैं और यह ऐसा नहीं कर सकता। इसके बजाय कोशिश करें:

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
आपको हमेशा एक varchar की लंबाई निर्दिष्ट करनी चाहिए: sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/…
Eugene Ryabtsev

धन्यवाद। थोड़ा देर से, लेकिन मैंने लंबाई मापदंडों को जोड़ा है।
टॉम एच

53

यदि आप SQL Server 2012 का उपयोग कर रहे हैं, तो आप CONCAT फ़ंक्शन का उपयोग कर सकते हैं जिसमें हमें कोई स्पष्ट रूपांतरण नहीं करना है

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

मैं कुछ ऐसे दावों के साथ आया हूं जो इससे भी CONCAT()तेज प्रदर्शन करते हैं CAST()। प्रदर्शन अध्ययन के विश्वसनीय स्रोत उपयोगी होंगे।
कोड्स हैमर

मुझे आश्चर्य नहीं होगा अगर यह एक बेंचमार्क में मापने योग्य था, लेकिन मुझे बहुत आश्चर्य होगा अगर यह सामान्य प्रश्नों में कोई प्रभाव डालता है। सामान्य परिचालन समय को डूबने के लिए आपके पास भारी संख्या में जातियां होनी चाहिए।
सिल्वरबैकनेट

8

इसे बदलो:

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

इसके लिए:

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

इसे बदलो:

SET @ActualWeightDIMS = @ActualWeight;

इसके लिए:

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

आपको CAST का उपयोग करना होगा। कास्ट और रूपांतरित करने के बारे में जानें यहाँ , क्योंकि डेटा प्रकार महत्वपूर्ण हैं!



4

आपको अपने पूर्णांक को स्ट्रिंग के रूप में डालना होगा, जब उन्हें एक विचर में बदलने की कोशिश की जाएगी।

अर्थात

 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 में, आप STRफ़ंक्शन का उपयोग कर सकते हैं :

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

2
डिफ़ॉल्ट रूप से STR फ़ंक्शन 10 वर्णों की संख्या को पैड करता है इसलिए यह रिक्त स्थान का भार जोड़ता है। उदाहरण के लिए STR(1)मुझे 9 स्थान दिए गए हैं 1CASTवास्तव में बेहतर काम करता है।
ताहिर हसन

2

पहले पूर्णांक के लिए पूर्णांक कास्ट करें!


बिल्कुल सही। स्ट्रिंग 'x' पूरी तरह से निरर्थक int पर्णपाती हैमर; यूडीएफ में कोई अंकगणित नहीं है।
bvj

2

आपको स्ट्रिंग समवर्ती करने से पहले स्ट्रिंग के लिए अपने संख्यात्मक डेटा को CAST करने की आवश्यकता है, इसलिए उदाहरण के लिए CAST(@Actual_Dims_Lenght AS VARCHAR)बस @Actual_Dims_Lenght, और c के बजाय उपयोग करें ।


2

मुझे नीचे दी गई क्वेरी की कोशिश की गई थी जो मेरे लिए बिल्कुल काम करती है

 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

एक स्ट्रिंग में जोड़ने से पहले, चींटियों को varchar में डालने की कोशिश करें:

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

जब आप Integer को Str ... सुरक्षित तरीका में परिवर्तित करते हैं तो संभावना है कि आप वैज्ञानिक संख्या के साथ समाप्त हो सकते हैं

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.