Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

टीएसक्यूएल:तालिका में स्ट्रिंग का नेस्टेड स्प्लिट/पार्स (एकाधिक समेकित टैग:एक स्ट्रिंग में मान)

यह एक ब्रूट-फोर्स फ़ंक्शन का एक सा है, लेकिन यह काम करता है... दो पैरामीटर लेता है (एक प्राथमिक सीमांकक के लिए, एक द्वितीयक सीमांकक के लिए):

IF EXISTS ( SELECT * from dbo.sysobjects WHERE id = object_id(N'[dbo].[doubleSplit]') 
            AND OBJECTPROPERTY(id, N'IsTableFunction') = 1 )
    DROP FUNCTION [dbo].[doubleSplit]
GO

CREATE FUNCTION dbo.doubleSplit ( 
        @sourceString varchar(MAX),
        @primaryDelimiter varchar(100),
        @secondaryDelimiter varchar(100) )
RETURNS @tblArray TABLE 
   (
    ElementID smallint IDENTITY(1,1),
    Element varchar(MAX),
    Value varchar(MAX)
   )
AS
BEGIN

    DECLARE @primaryIndex smallint
    DECLARE @secondaryIndex smallint
    DECLARE @primaryStart smallint
    DECLARE @secondaryStart smallint
    DECLARE @primaryDelimiterSize smallint
    DECLARE @seondaryDelimiterSize smallint
    DECLARE @primaryElement varchar(MAX);
    DECLARE @seondaryElement varchar(MAX);

    SET @primaryDelimiterSize = LEN(@primaryDelimiter)
    SET @seondaryDelimiterSize = LEN(@secondaryDelimiter)
    --loop through source string and add elements to destination table array
    WHILE LEN(@sourceString) > 0
    BEGIN
        SET @primaryIndex = CHARINDEX(@primaryDelimiter, @sourceString)
        IF @primaryIndex = 0
        BEGIN
            SET @secondaryIndex = CHARINDEX(@secondaryDelimiter, @sourceString)
            IF @secondaryIndex = 0
            BEGIN
                INSERT INTO @tblArray (Element, Value) VALUES(@sourceString, '')
            END
            ELSE
            BEGIN
                SET @secondaryStart = @secondaryIndex + @seondaryDelimiterSize;
                INSERT INTO @tblArray (Element, Value) 
                VALUES(SUBSTRING(@sourceString, 1, @secondaryIndex - 1), 
                       SUBSTRING(@sourceString, @secondaryIndex + @seondaryDelimiterSize, LEN(@sourceString) - @secondaryStart + 1))
            END
            BREAK
        END
        ELSE
        BEGIN
            SELECT @primaryElement = SUBSTRING(@sourceString, 1, @primaryIndex - 1);
            SET @secondaryIndex = CHARINDEX(@secondaryDelimiter, @primaryElement)
            SET @secondaryStart = @secondaryIndex + @seondaryDelimiterSize;
            INSERT INTO @tblArray (Element, Value) 
            VALUES(SUBSTRING(@primaryElement, 1, @secondaryIndex - 1), 
                   SUBSTRING(@primaryElement, @secondaryIndex + @seondaryDelimiterSize, LEN(@primaryElement) - @secondaryStart + 1))
            SET @primaryStart = @primaryIndex + @primaryDelimiterSize
            SET @sourceString = SUBSTRING(@sourceString, @primaryStart , LEN(@sourceString) - @primaryStart + 1)
        END
    END

    RETURN
END
GO

फिर आप इसे इस तरह कॉल कर सकते हैं और अपेक्षित परिणाम प्राप्त कर सकते हैं:

SELECT * FROM dbo.doubleSplit('a-->1,b-->16,x-->99', ',', '-->')

इसे लौटाता है:

ElementID   Element Value
1           a       1
2           b       16
3           x       99

और यह:

SELECT * FROM dbo.doubleSplit('a-->1', ',', '-->')

इसे लौटाता है:

ElementID  Element  Value
1          a        1

आदि, आदि।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. तालिका के केवल एक कॉलम के आधार पर डुप्लिकेट मानों को हटाना

  2. FIRST_VALUE और LAST_VALUE के साथ GROUP BY का उपयोग करना

  3. WHERE क्लॉज उन मानों का उपयोग कर रहा है जो NULL हो सकते हैं

  4. WinRT System.Data - SQL से कनेक्ट करें

  5. मौजूदा स्कीमा (एसक्यूएल सर्वर) से तालिका संबंध आरेख उत्पन्न करें