Создание UDF CLR с переменным количеством параметров

Я хотел, чтобы функция нашла, что самый большой из списка Строковых значений передал в.

Я хочу вызвать его как самый большой Выбор ('Abcd', 'Efgh', 'Zxy', 'EAD') от SQL-сервера. Это должно возвратить Zxy. Количество параметров является переменным. Случайно это очень похоже на оракула САМАЯ БОЛЬШАЯ функция. Таким образом, я записал очень простую функцию CLR (Vs2008) и попытался развернуть его. Посмотрите ниже

public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString Greatest(params SqlString[] p)
{
SqlString max=p[0];
foreach (string s in p)
max = s.CompareTo(max) > 0 ? s : max;

return max;

}
};

Но когда я пытаюсь скомпилировать, или развернуть его я добираюсь, следующая ошибка не Может найти тип данных SqlString [].

Действительно ли возможно удовлетворить мое требование с помощью SQL CLR?

1
задан Anthony Faull 7 June 2012 в 13:55
поделиться

1 ответ

Вот решение с использованием функции Table-Valued:

CREATE FUNCTION fn_Split
(
    @text VARCHAR(8000), 
    @delimiter VARCHAR(20) = ','
)
    RETURNS @Strings TABLE 
        (
            position INT IDENTITY PRIMARY KEY,
            value VARCHAR(8000)
        )
AS BEGIN
    DECLARE @index int
    SET @index = -1

    WHILE (LEN(@text) > 0) BEGIN
        -- Find the first delimiter
        SET @index = CHARINDEX(@delimiter , @text)

        -- No delimiter left?
        -- Insert the remaining @text and break the loop
        IF (@index = 0) AND (LEN(@text) > 0) BEGIN  
            INSERT INTO @Strings VALUES (LTRIM(RTRIM(@text)))
            BREAK 
        END 

        -- Found a delimiter
        -- Insert left of the delimiter and truncate the @text
        IF (@index > 1) BEGIN
            INSERT INTO @Strings VALUES (LTRIM(RTRIM(LEFT(@text, @index - 1))))
            SET @text = RIGHT(@text, (LEN(@text) - @index))
        END
        -- Delimiter is 1st position = no @text to insert
        ELSE SET @text = RIGHT(@text, (LEN(@text) - @index))
    END
    RETURN
END
GO

Тест:

DECLARE @test varchar(120)

SET @test = 'Abcd, Efgh, Zxy, EAD'

SELECT Top(1) value FROM dbo.fn_Split(@test, ',')
ORDER BY value DESC

GO

(Модифицированная функция split из здесь)

Примечание: Почти наверняка это не самый быстрый способ. Если вам нужно выполнить это миллионы раз, то более подходящим может оказаться другое решение.

1
ответ дан 3 September 2019 в 00:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: