У меня есть функция, которая выполняет оператор выбора. Когда я пытаюсь выполнить этот оператор выбора, который возвращает единственное значение и устанавливает его в переменную, моя функция падает со следующей ошибкой:
Сообщение 203, Уровень 16, Состояние 2, Процедура Info_GetWholeNumber, Строка 20
Имя «ВЫБЕРИТЕ МАКС» (ЛЕН (CAST (FLOOR ([pcom_audit_cant_con])) AS
VARCHAR (38)))) AS WHOLE_NO FROM Auditorias.prod_com_audit 'не является
действительный идентификатор.
Если я копирую и вставляю это выражение select, оно работает нормально ... поэтому это не select, это как-то связано с моим EXEC ... в любом случае вот мой код функций ...
ALTER FUNCTION [dbo].[Info_GetWholeNumber]
(
@TABLE VARCHAR(MAX)
, @COLUMN VARCHAR(MAX)
)
RETURNS INT
AS
BEGIN
-- Declare the return variable here
DECLARE @WHOLE_NO INT
-- Add the T-SQL statements to compute the return value here
DECLARE @SQL VARCHAR(MAX)
SET @SQL = 'SELECT MAX(LEN(CAST(FLOOR([' + @COLUMN + ']) AS VARCHAR(38))))
AS WHOLE_NO FROM ' + @TABLE
EXEC @WHOLE_NO = @SQL
-- Return the result of the function
RETURN @WHOLE_NO
END
Если у кого-нибудь есть идеи, как я могу это исправить, я буду очень признателен за помощь! Заранее спасибо!
ОБНОВЛЕНИЕ:
ОК, поэтому я пытаюсь использовать функцию sp_executesql, как указано, и я собираюсь вставить новую функцию.
ALTER FUNCTION [dbo].[Info_GetWholeNumber]
(
@TABLE VARCHAR(MAX)
, @COLUMN VARCHAR(MAX)
)
RETURNS INT
AS
BEGIN
DECLARE @WHOLE_NO INT
DECLARE @SQL NVARCHAR(MAX)
DECLARE @PARAMS NVARCHAR(MAX)
SET @SQL = N'SELECT @WHOLE_NOOUT = MAX(LEN(CAST(FLOOR(@COL) AS VARCHAR(38)))) FROM @TBL'
SET @PARAMS = N'@COL VARCHAR(MAX), @TBL VARCHAR(MAX), @WHOLE_NOOUT INT OUTPUT'
EXECUTE sp_executesql @SQL, @PARAMS, @COL = @COLUMN, @TBL = @TABLE, @WHOLE_NOOUT = @WHOLE_NO OUTPUT;
-- Return the result of the function
RETURN @WHOLE_NO
END
Теперь я получаю эту ошибку:
Сообщение 1087, Уровень 16, Состояние 1, Строка 1
Необходимо объявить табличную переменную "@TBL"
Что, на мой взгляд, кажется правильным, поскольку переменные не объявлены иначе, как в переменной @PARAM ... Я что-то здесь упускаю?