T-SQL: как оптимизировать эту функцию соединения? - PullRequest
0 голосов
/ 09 марта 2011

У меня есть следующий UDF в SQL-Server 2005. Он соединяет таблицу и объединяет все строки с разделителем в одно скалярное значение.Поскольку он мне нужен и для других таблиц, я подумал, как сделать его динамическим, чтобы он использовал FK, разделитель, таблицы имен отношений и имя столбца назначения.

Например, эта модель данных (функция на самом деле не должна знать tabData, только для полноты, добавленной здесь): enter image description here

Статическая скалярная функция, которую я хочу динамизировать,:

CREATE FUNCTION [dbo].[getTabDataSymptomCodes]
(
    @idData Int,
    @delimiter varchar(5)
)
RETURNS VARCHAR(8000)
AS
BEGIN
    DECLARE @Codes VARCHAR(8000) 
    SELECT   @Codes = COALESCE(@Codes + @delimiter, '') + tdefSymptomCode.SymptomCodeNumber
    FROM    trelData_SymptomCode INNER JOIN
            tdefSymptomCode ON trelData_SymptomCode.fiSymptomCode = tdefSymptomCode.idSymptomCode
    WHERE     (trelData_SymptomCode.fiData = @idData)
    ORDER BY tdefSymptomCode.SymptomCodeNumber
    return @Codes
END

Эта функция просто объединяет строки в одно значение varchar, разделенное разделителем, например '0345:0550:0700:1230', где : - разделитель.

Редактировать для пояснения: у меня уже есть UDF, который разбивает данный varchar, разделенный символом, на таблицу (например, '1,2,3,4' на отдельные строки).Теперь мне нужно наоборот (как String.Join(separator,array) в программировании).

Вот сплит-UDF для полноты:

CREATE FUNCTION [dbo].[Split]
(
    @ItemList NVARCHAR(MAX), 
    @delimiter CHAR(1)
)
RETURNS @IDTable TABLE (Item VARCHAR(50))  
AS      

BEGIN    
    DECLARE @tempItemList NVARCHAR(MAX)
    SET @tempItemList = @ItemList

    DECLARE @i INT    
    DECLARE @Item NVARCHAR(4000)

    SET @tempItemList = REPLACE (@tempItemList, ' ', '')
    SET @i = CHARINDEX(@delimiter, @tempItemList)

    WHILE (LEN(@tempItemList) > 0)
    BEGIN
        IF @i = 0
            SET @Item = @tempItemList
        ELSE
            SET @Item = LEFT(@tempItemList, @i - 1)
        INSERT INTO @IDTable(Item) VALUES(@Item)
        IF @i = 0
            SET @tempItemList = ''
        ELSE
            SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i)
        SET @i = CHARINDEX(@delimiter, @tempItemList)
    END 
    RETURN
END  

Заранее спасибо:)

1 Ответ

0 голосов
/ 09 марта 2011

Может быть, это может помочь:

Create FUNCTION [dbo].[StringJoin]
(
    @Seperator      char,
    @Array          varchar(200)
)
RETURNS nvarchar(256)
AS
BEGIN
    DECLARE
    @rv         varchar(200)
    select @rv=REPLACE(@Array,@Seperator,'')    
    RETURN @rv
END
...