एक संग्रहीत प्रक्रिया में अल्पविराम से अलग सूची कैसे पास करें?

तो मेरे पास एक Sybase संग्रहीत प्रो है जो 1 पैरामीटर लेता है जो तारों की अल्पविराम से अलग सूची है और एक आईएन() खंड में एक क्वेरी चलाता है:

CREATE PROCEDURE getSomething @keyList varchar(4096)
AS
SELECT * FROM mytbl WHERE name IN (@keyList)

मैं अपनी संग्रहित प्रो को सूची में 1 से अधिक मान के साथ कैसे कॉल करूं? अब तक मैंने कोशिश की है

exec getSomething 'John'         -- works but only 1 value
exec getSomething 'John','Tom'   -- doesn't work - expects two variables
exec getSomething "'John','Tom'" -- doesn't work - doesn't find anything
exec getSomething '"John","Tom"' -- doesn't work - doesn't find anything
exec getSomething '\'John\',\'Tom\'' -- doesn't work - syntax error

EDIT: I actually found this page that has a great reference of the various ways to pas an array to a sproc

0
ro fr bn
मुझे आशा है कि आपको एक विधि मिल जाएगी जो आपके लिए काम करती है। लिंक किया गया पृष्ठ विकल्पों की एक अच्छी सूची है, लेकिन मुझे यह देखकर खुशी हो रही है कि सबसे पहले ही यहां सुझाव दिया गया है! पॉल ने विधि 2/3, अस्थायी तालिकाओं का सुझाव दिया। मैंने विधि 1, गतिशील एसक्यूएल का सुझाव दिया। ब्रायन और हाबेल एक एक्सएमएल विधि का सुझाव देते हैं, हालांकि मुझे sybase में xml के लिए लाइसेंस प्राप्त नहीं है, इसलिए यह नहीं पता कि यह Sybase में काम करेगा या नहीं। विधि 4 के समान।
जोड़ा लेखक AdamH, स्रोत

10 उत्तर

पाठ को एक तालिका में विभाजित करने वाले फ़ंक्शन को पैरामीटर पास करने के केविन के विचार के बारे में, कुछ साल पहले उस समारोह का मेरा कार्यान्वयन यहां है। एक इलाज करता है।

SQL में शब्दों में पाठ को विभाजित करना

0
जोड़ा

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

DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='


   
      
      
   


   
      
   

'
--Create an internal representation of the xml document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT    *
FROM       OPENXML (@idoc, '/ROOT/Customer',1)
            WITH (CustomerID  varchar(10),
                  ContactName varchar(20))
0
जोड़ा

कॉमा से अलग सूची को उस फ़ंक्शन में पास करें जो तालिका मान देता है। StackOverflow पर कहीं भी एक एमएस एसक्यूएल उदाहरण है, अगर मैं इस समय इसे देख सकता हूं तो शापित।

 प्रक्रिया बनाएं कुछ प्राप्त करें @keyList varchar (4096)
जैसा
चुनें * mytbl से जहां नाम है (fn_GetKeyList (@keyList))
 

के साथ बुलाना -

  exec getSomething 'जॉन, टॉम, फू, बार'
 

मुझे लगता है कि Sybase कुछ ऐसा करने में सक्षम होना चाहिए?

0
जोड़ा

इस तरह से प्रयास करें। यह मेरे लिए काम करता है।

@itemIds varchar(max)

CREATE PROCEDURE getSomething @keyList varchar(4096)
AS
SELECT * FROM mytbl WHERE name IN (SELECT Value FROM [Global_Split] (@itemIds,','))
0
जोड़ा

इस तरह की कॉल के साथ समस्या: exec getSomething '"जॉन", "टॉम" यह है कि यह एक एकल स्ट्रिंग के रूप में जॉन "," टॉम "का इलाज कर रहा है, यह केवल उस तालिका में एक प्रविष्टि से मेल खाता है जो' ' जॉन "," टॉम " '।

यदि आप पौलुस के जवाब में एक अस्थायी तालिका का उपयोग नहीं करना चाहते थे, तो आप गतिशील एसक्यूएल का उपयोग कर सकते हैं। (मानता है v12 +)

CREATE PROCEDURE getSomething @keyList varchar(4096)
AS
declare @sql varchar(4096)
select @sql = "SELECT * FROM mytbl WHERE name IN (" + @keyList +")"
exec(@sql)

आपको यह सुनिश्चित करने की आवश्यकता होगी कि @keylist में आइटमों के चारों ओर उद्धरण हैं, भले ही वे एकल मान हों।

0
जोड़ा

यदि आप Sybase 12.5 या इससे पहले का उपयोग कर रहे हैं तो आप फ़ंक्शंस का उपयोग नहीं कर सकते हैं। एक वर्कअराउंड मूल्यों के साथ अस्थायी तालिका को पॉप्युलेट करना और वहां से उन्हें पढ़ना हो सकता है।

0
जोड़ा

सुनिश्चित नहीं है कि यह एएसई में है, लेकिन एसक्यूएल कहीं भी, sa_split_list फ़ंक्शन एक CSV से एक तालिका देता है। इसमें अलग-अलग डिलीमीटर (डिफ़ॉल्ट एक अल्पविराम) पास करने के लिए वैकल्पिक तर्क होते हैं और प्रत्येक लौटाए गए मान के लिए अधिकतम लम्बाई होती है।

sa_split_list फ़ंक्शन

0
जोड़ा

यह SQL में काम करता है। अपने GetSomething प्रक्रिया में एक प्रकार के एक्सएमएल के रूप में घोषित करें:

DECLARE @NameArray xml = NULL

संग्रहीत प्रक्रिया का शरीर निम्नलिखित लागू करता है:

चुनें * MyTbl से जहां नाम है (चुनें ParamValues.ID.value ('।', 'VARCHAR (10)')   @ NameArray.nodes ('id') से ParamValues ​​(ID))

एसक्यूएल कोड के भीतर से जो एसपी को कॉल करता है और संग्रहीत प्रक्रिया को कॉल करने से पहले xml चर प्रारंभ करता है:

DECLARE @NameArray xml

     

SET @NameArray = ' Name_1 Name_2 Name_3 Name_4 '

आपके उदाहरण का उपयोग संग्रहीत प्रक्रिया में कॉल होगा:

EXEC GetSomething @NameArray

प्राप्त करें

मैंने पहले इस विधि का उपयोग किया है और यह ठीक काम करता है। यदि आप एक त्वरित परीक्षण चाहते हैं, तो निम्न कोड को एक नई क्वेरी में कॉपी और पेस्ट करें और निष्पादित करें:

DECLARE @IdArray xml

     

SET @IdArray = ' Name_1 name_2 Name_3 Name_4 '

     

ParamValues.ID.value चुनें ('।', 'VARCHAR (10)')   @ IdArray.nodes ('id') से ParamValues ​​(ID)

से
0
जोड़ा

यह थोड़ा देर हो चुकी है, लेकिन मुझे कुछ समय पहले यह सही मुद्दा था और मुझे एक समाधान मिला।

चाल डबल उद्धरण है और फिर उद्धरण में पूरी स्ट्रिंग लपेटती है।

exec getSomething """John"",""Tom"",""Bob"",""Harry"""

स्ट्रिंग में तालिका प्रविष्टि से मेल खाने के लिए अपनी proc को संशोधित करें।

CREATE PROCEDURE getSomething @keyList varchar(4096)
AS
SELECT * FROM mytbl WHERE @keyList LIKE '%'+name+'%' 

एएसई 12.5 के बाद से यह उत्पादन में है; हम अब 15.0.3 पर हैं।

0
जोड़ा
आप उसमें देखना चाहेंगे ... यदि आपके पास टेबल में जैक है और जैकी की तलाश है तो आपको वास्तव में जैक मिल जाएगा :) यह शायद तालिका में प्रत्येक पंक्ति के लिए एक स्ट्रिंग बनाने, बहुत कुशल नहीं है।
जोड़ा लेखक JanHudecek, स्रोत

@Abel प्रदान किए गए पर छूने के लिए, मुझे किसने मदद की थी:

मेरा उद्देश्य एसएसआरएस से कभी भी अंतिम उपयोगकर्ता को इनपुट करना था और उसमें मेरे जहां क्लॉज इन इन (चयन) स्पष्ट रूप से @ICD_VALUE_RPT को मेरे डेटासेट क्वेरी में टिप्पणी की जाएगी।

DECLARE @ICD_VALUE_RPT VARCHAR(MAX) SET @ICD_VALUE_RPT = 'Value1, Value2'
DECLARE @ICD_VALUE_ARRAY xml SET @ICD_VALUE_ARRAY = CONCAT('', REPLACE(REPLACE(@ICD_VALUE_RPT, ',', ','),' ',''), '')

फिर मेरे <�कोड> कहां में मैंने जोड़ा:

(PATS_WITH_PL_DIAGS.ICD10_CODE IN (SELECT ParamValues.ID.value('.','VARCHAR(MAX)') FROM @ICD_VALUE_ARRAY.nodes('id') AS ParamValues(ID))
OR PATS_WITH_PL_DIAGS.ICD9_CODE IN (SELECT ParamValues.ID.value('.','VARCHAR(MAX)') FROM @ICD_VALUE_ARRAY.nodes('id') AS ParamValues(ID))
)
0
जोड़ा