Я хотел, чтобы функция нашла, что самый большой из списка Строковых значений передал в.
Я хочу вызвать его как самый большой Выбор ('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?
Вот решение с использованием функции 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 из здесь)
Примечание: Почти наверняка это не самый быстрый способ. Если вам нужно выполнить это миллионы раз, то более подходящим может оказаться другое решение.