#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