Oracle, MS SQL के लिए sql लिखने का कोई तरीका है:

Select * from table where id in(:arr)


Select * from table where id in(@arr)

वस्तुओं की एक सरणी का प्रतिनिधित्व करने के लिए एसक्यूएल 'गिरफ्तारी' में एक परम के साथ? मुझे ऐसे उदाहरण मिले जो एआर को @ arr0, .., @arrn और फ़ीड सरणी को n + 1 अलग पैरामीटर के रूप में विस्फोट करते हैं, सरणी नहीं, इस तरह

Select * from table where id in(:arr0, :arr1, :arr2)


Select * from table where id in(@arr0, @arr1, @arr2)

मैं जो चाहता हूं वह नहीं। ये sql क्वेरी में परिवर्तन का कारण बनेंगे और यह पैरामीटर की संख्या के आधार पर नई निष्पादन योजनाएँ बनाता है।

मैं .net, c# और Oracle और MS SQL मांगता हूं।

रचनात्मक विचारों के लिए धन्यवाद!

/आईपी/

0
ipavlu 29 फरवरी 2020, 17:13
नहीं, AFAIK एकाधिक मानों का प्रतिनिधित्व करने के लिए एक पैरामीटर का उपयोग करने का कोई तरीका नहीं है। आप टेबल वैल्यूड पैरामीटर्स को एक्सप्लोर कर सकते हैं< /a> इसके बजाय एक संग्रहीत कार्यविधि का उपयोग करके दृष्टिकोण
 – 
Steve
29 फरवरी 2020, 17:14

3 जवाब

जैसा कि स्टीव ने बताया, टेबल वैल्यूड पैरामीटर के अलावा, कुछ अन्य तकनीकें भी उपलब्ध हैं। उदाहरण के लिए आप एक सीमांकित स्ट्रिंग को पार्स कर सकते हैं

उदाहरण

Declare @arr varchar(50) = '10,20,35'

Select A.*
 From  YourTable A
 Join string_split(@arr,',') B on A.ID=value

या यहां तक ​​कि

Select A.*
 From  YourTable A
 Where ID in ( select value from string_split(@arr,',') )
0
John Cappelletti 29 फरवरी 2020, 17:21
खैर, यह मापदंडों का उपयोग नहीं कर रहा है और निश्चित रूप से निष्पादन योजना भी बर्बाद हो गई है।
 – 
Steve
29 फरवरी 2020, 17:36
बस एक विकल्प ... शायद मेरे पास आपसे अलग पढ़ा है। :)
 – 
John Cappelletti
29 फरवरी 2020, 17:38

मेरा मानना ​​है कि इस मामले के लिए टेबल वैल्यू पैरामीटर अच्छा विकल्प है। SQL सर्वर में नीचे एक नमूना कोड देखें।

-- Your table
CREATE TABLE SampleTable
(
    ID          INT
)

INSERT INTO SampleTable VALUES
(1010),
(2010),       
(3010),
(4010),
(5010),      
(6010),      
(7010),      
(8030)
GO

-- Create a TABLE type in SQL database which you can fill from front-end code
CREATE TYPE ParameterTableType AS TABLE  
(
    ParameterID INT
    --, some other columns
)
GO

-- Create a stored proc using table type defined above
CREATE PROCEDURE ParameterArrayProcedure
(
    @ParameterTable AS ParameterTableType READONLY
)
AS
BEGIN

    SELECT
        S.*
    FROM SampleTable S
    INNER JOIN @ParameterTable P ON S.ID = P.ParameterID

END
GO

-- Populated table type variable
DECLARE @ParameterTable AS ParameterTableType
INSERT INTO @ParameterTable (ParameterID) VALUES (1010), (4010), (7010)

EXECUTE ParameterArrayProcedure @ParameterTable

DROP PROCEDURE ParameterArrayProcedure
DROP TYPE ParameterTableType
DROP TABLE SampleTable
GO

तालिका मान पैरामीटर के अलावा, आप Json या XML मान SQL पैरामीटर के रूप में हैं लेकिन हां, यह निश्चित रूप से आपकी निष्पादन योजना को तदनुसार बदल देगा।

0
iVad 29 फरवरी 2020, 18:59
@ एमटी0, सी# में, आपको टीवीपी में परिभाषित समान कॉलम के साथ DataTable बनाने और इसे एसपी पैरामीटर के रूप में उपयोग करने की आवश्यकता है। यदि # कॉलम और उनके संबंधित डेटाटाइप मेल खाते हैं, तो SQL स्वयं इसे TVP के साथ मैप करेगा।
 – 
iVad
29 फरवरी 2020, 19:15

आकाशवाणी

अन्य भाषाओं (यानी जावा) में आप एक SQL संग्रह को बाइंड पैरामीटर के रूप में पास कर सकते हैं और सीधे SQL कथन में इसका उपयोग कर सकते हैं।

हालांकि, C# SQL संग्रहों को पारित करने का समर्थन नहीं करता है और केवल OracleCollectionType.PLSQLAssociativeArray (दस्तावेज़ीकरण लिंक) जो केवल PL/SQL डेटा-प्रकार है और नहीं कर सकता एसक्यूएल स्टेटमेंट में (सीधे) इस्तेमाल किया जा सकता है।

एक सरणी पास करने के लिए, आपको एक PLSQL संग्रहीत कार्यविधि के लिए एक PLSQLAssociativeArray पास करना होगा और इसे SQL संग्रह में परिवर्तित करने के लिए उपयोग करना होगा जिसे आप SQL कथन में उपयोग कर सकते हैं। पीएल/एसक्यूएल सहयोगी सरणी से एसक्यूएल संग्रह में कनवर्ट करने की प्रक्रिया का एक उदाहरण है:

CREATE TYPE IntList AS TABLE OF INTEGER
/

CREATE PACKAGE tools IS
  TYPE IntMap IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;

  FUNCTION IntMapToList(
    i_map IntMap
  ) RETURN IntList;
END;
/

CREATE PACKAGE BODY tools IS
  FUNCTION IntMapToList(
    i_map IntMap
  ) RETURN IntList
  IS
    o_list IntList := IntList();
    i      BINARY_INTEGER;
  BEGIN
    IF i_map IS NOT NULL THEN
      i := o_list.FIRST;
      WHILE i IS NOT NULL LOOP
        o_list.EXTEND;
        o_list( o_list.COUNT ) := i_map( i );
        i := i_map.NEXT( i );
      END LOOP;
    END IF;
    RETURN o_list;
  END;
END;
/
0
Community 20 जून 2020, 12:12