Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

TSQL:Вложено разделяне/разбор на низ в таблица (множество свързани етикети:Стойност в един низ)

Това е малко функция за груба сила, но работи... приема два параметъра (един за основния разделител, един за вторичния разделител):

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. Инструкция за изтриване на SQL Server:Как да премахнете един или умножете редове от таблицата

  2. Условно JOIN изявление SQL Server

  3. SQL Server Уникален композитен ключ от две полета с автоматично увеличение на второ поле

  4. MS Access извикване на SQL Server съхранена процедура

  5. ExecuteNonQuery връща -1 при използване на sql COUNT въпреки низа на заявката