दिलचस्प पोस्ट
जावा में वैध यूआरएल की जांच कैसे करें? MySQL: ऑर्डर ऑफ़ ऑर्डर आर रैंड () मैं एक MySQL डंप में इन टिप्पणियों से कैसे छुटकारा पा सकता हूं? स्मार्ट फोन की व्यापक श्रेणी तक पहुंचने के लिए ब्लैकबेरी के विकास में सबसे अच्छा अभ्यास क्या है? एपीके फ़ाइल का कोड निकालने का तरीका Log4j के लिए उत्पादन सेटिंग्स फ़ाइल? एक्लिप्से में जावास्क्रिप्ट डिबग करें कैसे जावा में हिश कोड () की गणना की जाती है स्प्रिंग बूट एंड स्प्रिंग सिक्योरिटी एप्लीकेशन में स्थिर वेब संसाधनों की सेवा एक्शन बार पर शीर्षक के पाठ का आकार कैसे बदल सकता है? POST और PUT HTTP अनुरोध के बीच क्या अंतर है? सर्विसलेट कैसे काम करते हैं? इंस्टांटिएशन, सत्र, साझा वैरिएबल और मल्टीथ्रेडिंग क्या है? = एक नियमित अभिव्यक्ति में क्या मतलब है? वीडियो दृश्य पर रीज्यूम वीडियो के बफर वाला भाग खो देता है क्या आपके .gitconfig में एक फ़ाइल शामिल करना संभव है?

SQL Server IN फ़ंक्शन में कॉमा से सीमांकित मानों से भरा एक वर्चार पास करना

का डुप्लिकेट
डायनामिक एसक्यूएल कॉमा डीलिमिट वैल्यू क्वेंशन
जैसे और अंदर के साथ पैरामीटर वाली क्वेरीज़

मेरे पास एक SQL सर्वर संग्रहित प्रक्रिया है, जहां मैं एक varchar के लिए कॉमा से सीमांकित मानों से भरा varchar पास करना चाहता हूं। उदाहरण के लिए:

 DECLARE @Ids varchar(50); SET @Ids = '1,2,3,5,4,6,7,98,234'; SELECT * FROM sometable WHERE tableid IN (@Ids); 

यह निश्चित रूप से काम नहीं करता है। मुझे त्रुटि मिलती है:

Varchar मान '1,2,3,5,4,6,7,98,234' डेटा प्रकार int में कनवर्ट करने में रूपांतरण विफल रहा।

गतिशील एसक्यूएल के निर्माण का सहारा लेने के बिना मैं इसे कैसे (या कुछ अपेक्षाकृत समान) पूरा कर सकता हूं?

Solutions Collecting From Web of "SQL Server IN फ़ंक्शन में कॉमा से सीमांकित मानों से भरा एक वर्चार पास करना"

एक स्ट्रिंग को विभाजित करने के लिए loops कि एक समारोह का उपयोग न करें! , नीचे मेरे फ़ंक्शन स्ट्रिंग को बहुत तेजी से विभाजित करेगा, जिसमें कोई पाशन नहीं होगा!

अपने फ़ंक्शन का उपयोग करने से पहले, आपको एक "सहायक" तालिका सेट अप करने की आवश्यकता है, आपको प्रति डेटाबेस केवल एक बार करना होगा:

 CREATE TABLE Numbers (Number int NOT NULL, CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] DECLARE @x int SET @x=0 WHILE @x<8000 BEGIN SET @x=@x+1 INSERT INTO Numbers VALUES (@x) END 

इस स्ट्रिंग को विभाजित करने के लिए इस फ़ंक्शन का उपयोग करें, जो लूप नहीं है और बहुत तेज़ है:

 CREATE FUNCTION [dbo].[FN_ListToTable] ( @SplitOn char(1) --REQUIRED, the character to split the @List string on ,@List varchar(8000) --REQUIRED, the list to split apart ) RETURNS @ParsedList table ( ListValue varchar(500) ) AS BEGIN /** Takes the given @List string and splits it apart based on the given @SplitOn character. A table is returned, one row per split item, with a column name "ListValue". This function workes for fixed or variable lenght items. Empty and null items will not be included in the results set. Returns a table, one row per item in the list, with a column name "ListValue" EXAMPLE: ---------- SELECT * FROM dbo.FN_ListToTable(',','1,12,123,1234,54321,6,A,*,

,,,,B') returns: ListValue ———– 1 12 123 1234 54321 6 A *

B (10 row(s) affected) **/ —————- –SINGLE QUERY– –this will not return empty rows —————- INSERT INTO @ParsedList (ListValue) SELECT ListValue FROM (SELECT LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number – 1))) AS ListValue FROM ( SELECT @SplitOn + @List + @SplitOn AS List2 ) AS dt INNER JOIN Numbers n ON n.Number < LEN(dt.List2) WHERE SUBSTRING(List2, number, 1) = @SplitOn ) dt2 WHERE ListValue IS NOT NULL AND ListValue!='' RETURN END –Function FN_ListToTable

आप इस फ़ंक्शन को किसी शामिल में एक तालिका के रूप में उपयोग कर सकते हैं:

 SELECT Col1, COl2, Col3... FROM YourTable INNER JOIN FN_ListToTable(',',@YourString) s ON YourTable.ID = s.ListValue 

यहां आपका उदाहरण है:

 Select * from sometable where tableid in(SELECT ListValue FROM dbo.FN_ListToTable(',',@Ids) s) 

बेशक अगर आप मेरे जैसे आलसी हैं, तो आप ऐसा कर सकते हैं:

 Declare @Ids varchar(50) Set @Ids = ',1,2,3,5,4,6,7,98,234,' Select * from sometable where Charindex(','+cast(tableid as varchar(8000))+',', @Ids) > 0 

कोई टेबल नहीं फ़ंक्शन नहीं लूप

तालिका में अपनी सूची को पार्स करने के विचार पर हमारे डीबीए XML का सुझाव देते हुए बिल्डिंग

 Declare @Ids varchar(50) Set @Ids = '1,2,3,5,4,6,7,98,234' DECLARE @XML XML SET @XML = CAST('<i>' + REPLACE(@Ids, ',', '</i><i>') + '</i>' AS XML) SELECT * FROM SomeTable INNER JOIN @XML.nodes('i') x(i) ON SomeTable .Id = xivalue('.', 'VARCHAR(MAX)') 

ऐसा लगता है कि @ केएम के उत्तर के रूप में एक ही प्रदर्शन है लेकिन, मुझे लगता है, बहुत आसान है।

आप ऐसा फ़ंक्शन बना सकते हैं जो तालिका लौटाता है

तो आपका कथन ऐसा कुछ होगा

 select * from someable join Splitfunction(@ids) as splits on sometable.id = splits.id 

यहाँ एक सिमुलर फ़ंक्शन है

 CREATE FUNCTION [dbo].[FUNC_SplitOrderIDs] ( @OrderList varchar(500) ) RETURNS @ParsedList table ( OrderID int ) AS BEGIN DECLARE @OrderID varchar(10), @Pos int SET @OrderList = LTRIM(RTRIM(@OrderList))+ ',' SET @Pos = CHARINDEX(',', @OrderList, 1) IF REPLACE(@OrderList, ',', '') <> '' BEGIN WHILE @Pos > 0 BEGIN SET @OrderID = LTRIM(RTRIM(LEFT(@OrderList, @Pos - 1))) IF @OrderID <> '' BEGIN INSERT INTO @ParsedList (OrderID) VALUES (CAST(@OrderID AS int)) --Use Appropriate conversion END SET @OrderList = RIGHT(@OrderList, LEN(@OrderList) - @Pos) SET @Pos = CHARINDEX(',', @OrderList, 1) END END RETURN END 

यह एक बहुत ही सामान्य प्रश्न है डिब्बाबंद जवाब, कई अच्छी तकनीकों:

http://www.sommarskog.se/arrays-in-sql-2005.html

यह पूरी तरह से काम करता है! नीचे दिए गए उत्तर बहुत जटिल हैं इसे गतिशील के रूप में न देखें अपनी दुकान प्रक्रिया को निम्नानुसार सेट अप करें:

 (@id as varchar(50)) as Declare @query as nvarchar(max) set @query =' select * from table where id in('+@id+')' EXECUTE sp_executesql @query 

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

मैं इस तरह से प्रयोग करने का सुझाव दे सकता हूं:

 DECLARE @Delim char(1) = ','; SET @Ids = @Ids + @Delim; WITH CTE(i, ls, id) AS ( SELECT 1, CHARINDEX(@Delim, @Ids, 1), SUBSTRING(@Ids, 1, CHARINDEX(@Delim, @Ids, 1) - 1) UNION ALL SELECT i + 1, CHARINDEX(@Delim, @Ids, ls + 1), SUBSTRING(@Ids, ls + 1, CHARINDEX(@Delim, @Ids, ls + 1) - CHARINDEX(@Delim, @Ids, ls) - 1) FROM CTE WHERE CHARINDEX(@Delim, @Ids, ls + 1) > 1 ) SELECT t.* FROM yourTable t INNER JOIN CTE c ON t.id = c.id; 

नीचे की तरह एक तालिका फ़ंक्शन बनाएं, जो अल्पविराम से अलग varchar को पार्स करते हैं और एक मेज देता है जो अन्य तालिकाओं के साथ आंतरिक रूप से शामिल हो सकता है

 CREATE FUNCTION [dbo].[fn_SplitList] ( @inString varchar(MAX) = '', @inDelimiter char(1) = ',' -- Keep the delimiter to 100 chars or less. Generally a delimiter will be 1-2 chars only. ) RETURNS @tbl_Return table ( Unit varchar(1000) COLLATE Latin1_General_BIN ) AS BEGIN INSERT INTO @tbl_Return SELECT DISTINCT LTRIM(RTRIM(piece.value('./text()[1]', 'varchar(1000)'))) COLLATE DATABASE_DEFAULT AS Unit FROM ( -- -- Replace any delimiters in the string with the "X" tag. -- SELECT CAST(('<X>' + REPLACE(s0.prsString, s0.prsSplitDelimit, '</X><X>') + '</X>') AS xml).query('.') AS units FROM ( -- -- Convert the string and delimiter into XML. -- SELECT (SELECT @inString FOR XML PATH('')) AS prsString, (SELECT @inDelimiter FOR XML PATH('')) AS prsSplitDelimit ) AS s0 ) AS s1 CROSS APPLY units.nodes('X') x(piece) RETURN END 

================================================= अब आपके कोड में उपरोक्त तालिका फ़ंक्शन का उपभोग करें, फ़ंक्शन का निर्माण आपके डेटाबेस में एक बार गतिविधि है जिसका उपयोग डेटाबेस के साथ-साथ एक ही सर्वर पर किया जा सकता है।

 DECLARE @Ids varchar(50); SET @Ids = '1,2,3,5,4,6,7,98,234'; SELECT * FROM sometable AS st INNER JOIN fn_SplitList(@ids, ',') AS sl ON sl.unit = st.tableid 

धन्यवाद, आपके फ़ंक्शन के लिए मैंने इसे इस्तेमाल किया …………………… यह मेरा उदाहरण है

 **UPDATE [RD].[PurchaseOrderHeader] SET [DispatchCycleNumber] ='10' WHERE OrderNumber in(select * FROM XA.fn_SplitOrderIDs(@InvoiceNumberList))** CREATE FUNCTION [XA].[fn_SplitOrderIDs] ( @OrderList varchar(500) ) RETURNS @ParsedList table ( OrderID int ) AS BEGIN DECLARE @OrderID varchar(10), @Pos int SET @OrderList = LTRIM(RTRIM(@OrderList))+ ',' SET @Pos = CHARINDEX(',', @OrderList, 1) IF REPLACE(@OrderList, ',', '') <> '' BEGIN WHILE @Pos > 0 BEGIN SET @OrderID = LTRIM(RTRIM(LEFT(@OrderList, @Pos - 1))) IF @OrderID <> '' BEGIN INSERT INTO @ParsedList (OrderID) VALUES (CAST(@OrderID AS int)) --Use Appropriate conversion END SET @OrderList = RIGHT(@OrderList, LEN(@OrderList) - @Pos) SET @Pos = CHARINDEX(',', @OrderList, 1) END END RETURN END 

यदि आप SQL Server 2008 या उच्चतर उपयोग करते हैं, तालिका मानदंडों का उपयोग करें; उदाहरण के लिए:

 CREATE PROCEDURE [dbo].[GetAccounts](@accountIds nvarchar) AS BEGIN SELECT * FROM accountsTable WHERE accountId IN (select * from @accountIds) END CREATE TYPE intListTableType AS TABLE (n int NOT NULL) DECLARE @tvp intListTableType -- inserts each id to one row in the tvp table INSERT @tvp(n) VALUES (16509),(16685),(46173),(42925),(46167),(5511) EXEC GetAccounts @tvp 

मुझे लगता है कि एक बहुत आसान समाधान निम्नलिखित हो सकता है:

 DECLARE @Ids varchar(50); SET @Ids = '1,2,3,5,4,6,7,98,234'; SELECT * FROM sometable WHERE ','+@Ids+',' LIKE '%,'+CONVERT(VARCHAR(50),tableid)+',%'; 

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

 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[uspSplitTextList]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1) DROP PROCEDURE [dbo].[uspSplitTextList] GO SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -- uspSplitTextList -- -- Description: -- splits a separated list of text items and returns the text items -- -- Arguments: -- @list_text - list of text items -- @Delimiter - delimiter -- -- Notes: -- 02/22/2006 - WSR : use DATALENGTH instead of LEN throughout because LEN doesn't count trailing blanks -- -- History: -- 02/22/2006 - WSR : revised algorithm to account for items crossing 8000 character boundary -- 09/18/2006 - WSR : added to this project -- CREATE PROCEDURE uspSplitTextList @list_text text, @Delimiter varchar(3) AS SET NOCOUNT ON DECLARE @InputLen integer -- input text length DECLARE @TextPos integer -- current position within input text DECLARE @Chunk varchar(8000) -- chunk within input text DECLARE @ChunkPos integer -- current position within chunk DECLARE @DelimPos integer -- position of delimiter DECLARE @ChunkLen integer -- chunk length DECLARE @DelimLen integer -- delimiter length DECLARE @ItemBegPos integer -- item starting position in text DECLARE @ItemOrder integer -- item order in list DECLARE @DelimChar varchar(1) -- first character of delimiter (simple delimiter) -- create table to hold list items -- actually their positions because we may want to scrub this list eliminating bad entries before substring is applied CREATE TABLE #list_items ( item_order integer, item_begpos integer, item_endpos integer ) -- process list IF @list_text IS NOT NULL BEGIN -- initialize SET @InputLen = DATALENGTH(@list_text) SET @TextPos = 1 SET @DelimChar = SUBSTRING(@Delimiter, 1, 1) SET @DelimLen = DATALENGTH(@Delimiter) SET @ItemBegPos = 1 SET @ItemOrder = 1 SET @ChunkLen = 1 -- cycle through input processing chunks WHILE @TextPos <= @InputLen AND @ChunkLen <> 0 BEGIN -- get current chunk SET @Chunk = SUBSTRING(@list_text, @TextPos, 8000) -- setup initial variable values SET @ChunkPos = 1 SET @ChunkLen = DATALENGTH(@Chunk) SET @DelimPos = CHARINDEX(@DelimChar, @Chunk, @ChunkPos) -- loop over the chunk, until the last delimiter WHILE @ChunkPos <= @ChunkLen AND @DelimPos <> 0 BEGIN -- see if this is a full delimiter IF SUBSTRING(@list_text, (@TextPos + @DelimPos - 1), @DelimLen) = @Delimiter BEGIN -- insert position INSERT INTO #list_items (item_order, item_begpos, item_endpos) VALUES (@ItemOrder, @ItemBegPos, (@TextPos + @DelimPos - 1) - 1) -- adjust positions SET @ItemOrder = @ItemOrder + 1 SET @ItemBegPos = (@TextPos + @DelimPos - 1) + @DelimLen SET @ChunkPos = @DelimPos + @DelimLen END ELSE BEGIN -- adjust positions SET @ChunkPos = @DelimPos + 1 END -- find next delimiter SET @DelimPos = CHARINDEX(@DelimChar, @Chunk, @ChunkPos) END -- adjust positions SET @TextPos = @TextPos + @ChunkLen END -- handle last item IF @ItemBegPos <= @InputLen BEGIN -- insert position INSERT INTO #list_items (item_order, item_begpos, item_endpos) VALUES (@ItemOrder, @ItemBegPos, @InputLen) END -- delete the bad items DELETE FROM #list_items WHERE item_endpos < item_begpos -- return list items SELECT SUBSTRING(@list_text, item_begpos, (item_endpos - item_begpos + 1)) AS item_text, item_order, item_begpos, item_endpos FROM #list_items ORDER BY item_order END DROP TABLE #list_items RETURN /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO 

इसकी थोड़ी देर हो गई है, लेकिन मैंने एक्सएमएल को अंतरिम के रूप में इस्तेमाल करते हुए यह किया है

मैं इसके लिए कोई क्रेडिट नहीं ले सकता, लेकिन मुझे डर है कि मुझे अब यह पता नहीं है कि मुझे यह विचार कहां से मिला है:

 -- declare the variables needed DECLARE @xml as xml,@str as varchar(100),@delimiter as varchar(10) -- The string you want to split SET @str='A,B,C,D,E,Bert,Ernie,1,2,3,4,5' -- What you want to split on. Can be a single character or a string SET @delimiter =',' -- Convert it to an XML document SET @xml = cast(('<X>'+replace(@str,@delimiter ,'</X><X>')+'</X>') as xml) -- Select back from the XML SELECT N.value('.', 'varchar(10)') as value FROM @xml.nodes('X') as T(N) 

मुझे उपयोगकर्ता के.एम. के साथ एक ही विचार है लेकिन अतिरिक्त तालिका नंबर की आवश्यकता नहीं है सिर्फ यह फ़ंक्शन केवल।

 CREATE FUNCTION [dbo].[FN_ListToTable] ( @SplitOn char(1) --REQUIRED, the character to split the @List string on ,@List varchar(8000) --REQUIRED, the list to split apart ) RETURNS @ParsedList table ( ListValue varchar(500) ) AS BEGIN DECLARE @number int = 0 DECLARE @childString varchar(502) = '' DECLARE @lengthChildString int = 0 DECLARE @processString varchar(502) = @SplitOn + @List + @SplitOn WHILE @number < LEN(@processString) BEGIN SET @number = @number + 1 SET @lengthChildString = CHARINDEX(@SplitOn, @processString, @number + 1) - @number - 1 IF @lengthChildString > 0 BEGIN SET @childString = LTRIM(RTRIM(SUBSTRING(@processString, @number + 1, @lengthChildString))) IF @childString IS NOT NULL AND @childString != '' BEGIN INSERT INTO @ParsedList(ListValue) VALUES (@childString) SET @number = @number + @lengthChildString - 1 END END END RETURN END 

और यहां परीक्षा है:

 SELECT ListValue FROM dbo.FN_ListToTable('/','a/////bb/c') 

परिणाम:

  ListValue ______________________ a bb c 
 -- select * from dbo.Split_ID('77,106') ALTER FUNCTION dbo.Split_ID(@String varchar(8000)) returns @temptable TABLE (ID varchar(8000)) as begin declare @idx int declare @slice varchar(8000) declare @Delimiter char(1) set @Delimiter =',' select @idx = 1 if len(@String)<1 or @String is null return while @idx!= 0 begin set @idx = charindex(@Delimiter,@String) if @idx!=0 set @slice = left(@String,@idx - 1) else set @slice = @String if(len(@slice)>0) insert into @temptable(ID) values(@slice) set @String = right(@String,len(@String) - @idx) if len(@String) = 0 break end return end 

आप ऐसा कर सकते हैं:

 create or replace PROCEDURE UDP_SETBOOKMARK ( P_USERID IN VARCHAR2 , P_BOOKMARK IN VARCHAR2 ) AS BEGIN UPDATE T_ER_Bewertung SET LESEZEICHEN = P_BOOKMARK WHERE STAMM_ID in( select regexp_substr(P_USERID,'[^,]+', 1, level) from dual connect by regexp_substr(P_USERID, '[^,]+', 1, level) is not null ) and ER_ID = (select max(ER_ID) from T_ER_Bewertung_Kopie); commit; END UDP_SETBOOKMARK; 

फिर इसके साथ प्रयास करें

 Begin UDP_SETBOOKMARK ('1,2,3,4,5', 'Test'); End; 

आप इन स्थितियों में regexp_substr के साथ अन्य स्थितियों में भी उपयोग कर सकते हैं, बस इसे आज़माएं

मुझे सबसे आसान तरीका FIND_IN_SET का उपयोग करना था

FIND_IN_SET (column_name, मान)

मान = (1,2,3)

SELECT NAME WHERE FIND_IN_SET (आईडी, मान)

 Error 493: The column 'i' that was returned from the nodes() method cannot be used directly. It can only be used with one of the four XML data type methods, exist(), nodes(), query(), and value(), or in IS NULL and IS NOT NULL checks. 

उपरोक्त errorr SQL सर्वर 2014 में निम्नलिखित स्निपेट का उपयोग करके तय किया गया था

 Declare @Ids varchar(50) Set @Ids = '1,2,3,5,4,6,7,98,234' DECLARE @XML XML SET @XML = CAST('<i>' + REPLACE(@Ids, ',', '</i><i>') + '</i>' AS XML) SELECT SomeTable.* FROM SomeTable cross apply @XML.nodes('i') x(i) where SomeTable .Id = xivalue('.', 'VARCHAR(MAX)') 

इसे इस्तेमाल करे:

 SELECT ProductId, Name, Tags FROM Product WHERE '1,2,3,' LIKE '%' + CAST(ProductId AS VARCHAR(20)) + ',%'; 

जैसा कि इस लिंक के अंतिम उदाहरण में कहा गया है

सर्वश्रेष्ठ और सरल दृष्टिकोण

 DECLARE @AccumulateKeywordCopy NVARCHAR(2000),@IDDupCopy NVARCHAR(50); SET @AccumulateKeywordCopy =''; SET @IDDupCopy =''; SET @IDDup = (SELECT CONVERT(VARCHAR(MAX), <columnName>) FROM <tableName> WHERE <clause>) SET @AccumulateKeywordCopy = ','+@AccumulateKeyword+','; SET @IDDupCopy = ','+@IDDup +','; SET @IDDupCheck = CHARINDEX(@IDDupCopy,@AccumulateKeywordCopy)