У меня есть рабочая функция:
CREATE FUNCTION SearchPartialText (@textToSearch nvarchar(100))
RETURNS TABLE
AS
RETURN
(
SELECT FullName FROM Animal
WHERE FullName COLLATE Latin1_general_CI_AI Like '%'+@textToSearch+'%'
COLLATE Latin1_general_CI_AI
);
GO
с этим тестовым кодом:
select * from SearchPartialText ('siren');
Теперь мне нужно преобразовать его для использования динамического c SQL по порядку для указания имени столбца и таблицы. Итак, я обновил функцию следующим образом:
CREATE FUNCTION SearchPartialText (@textToSearch nvarchar(100), -- Text to search
@columnName nvarchar(100), -- Column to look into
@tableName nvarchar(100)) -- Table to use
RETURNS @TestTable TABLE (generic_name VARCHAR(50))
AS
BEGIN
DECLARE @sql nvarchar(max)
Set @sql = 'SELECT ' + QUOTENAME(@columnName) + ' FROM ' + QUOTENAME(@tableName) + ' WHERE ' + QUOTENAME(@columnName) + ' COLLATE Latin1_general_CI_AI Like %' + QUOTENAME(@textToSearch) + '% COLLATE Latin1_general_CI_AI'
Execute sp_executesql @sql
RETURN;
END;
использование QUOTENAME предназначено для предотвращения SQL инъекции.
Теперь тестовый код:
select * from SearchPartialText ('siren', 'FullName', 'Animal');
Но у меня есть сообщение об ошибке в этом тестовом коде: Из функции могут выполняться только функции и расширенные хранимые процедуры
Я немного запутался. Возможно ли это хотя бы? Спасибо за помощь. Винсент