Обновить функцию до динамического c SQL - PullRequest
0 голосов
/ 28 мая 2020

У меня есть рабочая функция:

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');

Но у меня есть сообщение об ошибке в этом тестовом коде: Из функции могут выполняться только функции и расширенные хранимые процедуры

Я немного запутался. Возможно ли это хотя бы? Спасибо за помощь. Винсент

...