T-sql, запуск функции, имя которой хранится в строковой переменной…с чем-то вроде exec … и получение возвращаемого значения

#sql #function #tsql #dynamic-sql

#sql #функция #tsql #динамический-sql

Вопрос:

Следующий код работает нормально (Echo — это определяемая пользователем функция, которая принимает строку и возвращает строку):

 Declare @ttt varchar(max) = ''
set @ttt = dbo.Echo('sdf')
print @ttt
  

Но проблема в том, что у меня есть параметр конфигурации, который сохраняет имя функции в текущей базе данных. Функция должна принимать строковый параметр и возвращать строковый параметр. Поэтому я не обязательно хочу вызывать dbo.Echo . Но я хочу вызвать все, что настроено.

Итак, я пытаюсь сделать что-то вроде этого:

 Declare @ttt varchar(max) = ''
Declare @sql varchar(Max)
Declare @func varchar(Max)
Declare @par varchar(max)
set @func = '[dbo].[Echo]'
set @par = 'sdf'
set @sql = 'set @ttt = '   @func   '('   ''''   @par   ''''   ')'
exec (@sql)
print @ttt
  

Но это говорит мне, что scaler @ttt не объявлен!

Итак, я попробовал так…

 Declare @ttt varchar(max) = ''
Declare @sql varchar(Max)
Declare @func varchar(Max)
Declare @par varchar(max)
set @func = '[dbo].[Echo]'
set @par = 'sdf'
set @sql = @func   '('   ''''   @par   ''''   ')'
set @ttt = exec (@sql)
print @ttt
  

Я получаю «Неправильный синтаксис рядом с ключевым словом exec»

Как мне получить возвращаемое значение и сохранить его в @ttt?

Уважаемый StackExchange: на вашем сайте ошибка. Мне не разрешено вводить следующий комментарий в ответ на принятый ответ.

Вот комментарий к принятому ответу: это работает, но я должен объявить @sql как: Объявить @sql nvarchar(Max) .

Ответ №1:

Если я правильно понимаю, вам нужен выходной параметр:

 declare @tttx varchar(max);

set @sql = 'set @ttt = '   @func   '('   ''''   @par   ''''   ')'
exec sp_executesql @sql,
                   N'@ttt varchar(max) output',
                   @ttt=@tttx output;

print @tttx;    
  

Комментарии:

1. это работает после того, как я установил для своего sql значение nvarchar(max). Я не совсем понимаю, почему <at sign>ttt = <at sign>ttt output; требуется в синтаксисе …. так что я не совсем понимаю его назначение, но это необходимо, и это работает. Если я добавлю <at sign> в этот комментарий, мне не разрешат публиковать….

2. @HillOfBeans Если у вас есть код входа в систему, например @ttt = @ttt output , он работает. Щелкните help справа от поля комментариев для получения сведений о мини-уценке. Небольшая путаница возникает из-за использования @ttt в качестве переменной, объявленной в первой строке, и параметра sp_executesql . В @ttt = @ttt output левой части находится параметр, а в правой части — переменная, которая получает выходные данные. Взгляните на пример C на sp_executesql .

3. @HillOfBeans . , , Это синтаксис для передачи параметров в хранимую процедуру. Второй аргумент определяет типы параметров. Третий присваивает значения (как входящие, так и исходящие).

4. я отредактировал ответ, потому что он становится запутанным…. @ttt= @ttt