2012-04-26 12 views
5

मेरे पास निम्न कोड है, समस्या यह है कि मेरी परिवर्तनीय सूची @LLLLLLLLLILLLILLILIL/जब मैं इसका उपयोग उस स्थान के हिस्से के रूप में करता हूं जहां स्थान आईडी (@LocationList) में यह कहता है कि यह int नहीं है (LocationID एक int है)। मैं इस सीएसवी स्ट्रिंग को खंड में teh द्वारा स्वीकार करने के लिए कैसे प्राप्त कर सकता हूं?एसक्यूएल में (@Variable) क्वेरी

Declare @LocationList varchar(1000) 
Set @LocationList = '1,32' 

select Locations from table where Where LocationID in (@LocationList) 
+1

संभव डुप्लिकेट - पैरामीटर दर्रा "IN" सरणी सूची के लिए?] (http://stackoverflow.com/questions/537087/sql-server-sp-pass-parameter-for-in-array-list) – Lamak

+0

क्या आपने एक [टेबल-वैल्यू पैरामीटर का उपयोग करने पर विचार किया है ] (http://msdn.microsoft.com/en-us/library/bb510489.aspx) इसके बजाए। यह इसे तालिका से स्थान का चयन करेगा जहां स्थान आईडीआई (स्थानसूची से स्थान का चयन करें) ' –

उत्तर

5

यह करने के लिए सबसे कारगर तरीका rt2800 का उल्लेख है जैसे (माइकल एलन द्वारा इंजेक्शन चेतावनी के साथ) गतिशील एसक्यूएल के साथ है

लेकिन अगर आप एक समारोह बना सकते हैं:

ALTER FUNCTION [dbo].[CSVStringsToTable_fn] (@array VARCHAR(8000)) 
RETURNS @Table TABLE (value VARCHAR(100)) 
AS 
    BEGIN 
     DECLARE @separator_position INTEGER, 
      @array_value VARCHAR(8000) 

     SET @array = @array + ',' 

     WHILE PATINDEX('%,%', @array) <> 0 
      BEGIN 
       SELECT @separator_position = PATINDEX('%,%', @array) 
       SELECT @array_value = LEFT(@array, @separator_position - 1) 

       INSERT @Table 
       VALUES (@array_value) 

       SELECT @array = STUFF(@array, 1, @separator_position, '') 
      END 
     RETURN 
    END 

और इससे चुनें:

DECLARE @LocationList VARCHAR(1000) 
SET @LocationList = '1,32' 

SELECT Locations 
FROM table 
WHERE LocationID IN (SELECT * 
          FROM  dbo.CSVStringsToTable_fn(@LocationList)) 

या

SELECT Locations 
FROM table loc 
     INNER JOIN dbo.CSVStringsToTable_fn(@LocationList) list 
      ON list.value = loc.LocationID 

कौन सा अत्यंत उपयोगी है जब आप SSRS से एक PROC अनुसार बहु-मूल्य सूची भेजने के लिए प्रयास करते हैं।

+0

कृपया ध्यान दें, आपको ** ** आवश्यकतानुसार – SQLMason

+0

आह के रूप में डालने की आवश्यकता है, यह भी एक अच्छा विचार है, धन्यवाद –

0
declare @querytext Nvarchar(MAX) 

set @querytext = 'select Locations from table where Where LocationID in (' + @LocationList + ');'; 

exec sp_executesql @querytext; 
+0

इस दृष्टिकोण के खिलाफ अत्यधिक सुझाव, एसक्यूएल इंजेक्शन के लिए बहुत अधिक जोखिम। सामान्य रूप से निष्पादन विधि से दूर रहें, यह बहुत खतरनाक है। –

+0

@MichaelAllen यह आपकी सूची कैसे उत्पन्न होता है इस पर निर्भर करता है, हालांकि आप SQL इंजेक्शन के बारे में सही हैं और ** sp_executesql ** बेहतर होगा - क्योंकि यह निष्पादन योजना को कैश भी कर सकता है। – SQLMason

1

मुझे अक्सर यह आवश्यकता होती है, और SOMETIME, यदि आप कॉलम [आकार/प्रारूप/लंबाई] पर खोज रहे कॉलम को बहुत अच्छी तरह से जानते हैं, तो आप एक प्रकार का रेगेक्स कर सकते हैं।

कुछ इस तरह:

DECLARE @MyListOfLocation varchar(255) 
    set @MyListOfLocation = '|1|32|36|24|3|' 

    Select LocationID 
    from Table 
    where @MyListOfLocation like '%|' + LocationID + '|%' 

नोट: पाइप चरित्र (उदाहरण के लिए, '1') किसी भी LocationID है कि एक ही वर्ण है लौटने से क्वेरी की रक्षा के लिए प्रयोग किया जाता है।

DECLARE @MyListOfLocation varchar(255) 
set @MyListOfLocation = '|1|11|21|' 

SELECT LocationName 
FROM (
     select '1' as LocationID, 'My Location 1' as LocationName 
     union all 
     select '11' as LocationID, 'My Location 11' as LocationName 
     union all 
     select '12' as LocationID, 'My Location 12' as LocationName 
     union all 
     select '13' as LocationID, 'My Location 13' as LocationName 
     union all 
     select '21' as LocationID, 'My Location 21' as LocationName 
    ) as MySub 
where @MyListOfLocation like '%|' + LocationID + '|%' 

चेतावनी:

यहां एक संपूर्ण काम कर उदाहरण है! यह विधि इंडेक्स अनुकूल नहीं है!

आप अनुक्रमित के उपयोग का लाभ उठाने के सब में से कुछ में (@MyListOfLocation) जोड़ूं, चाहते हैं, आप अपनी स्क्रिप्ट को संशोधित कर सकते करने के लिए:

SELECT MyDATA.* 
FROM HugeTableWithAnIndexOnLocationID as MyDATA 
WHERE LocationID in (
     Select LocationID 
     from Table 
     where @MyListOfLocation like '%|' + LocationID + '|%') 
की [एसक्यूएल सर्वर सपा
संबंधित मुद्दे