T-sql, 运行 名称存储在字符串变量中的函数...使用类似 exec 的函数...并捕获 return 值

T-sql, Running the function whose name is stored in a string variable...with something like exec...and capturing the return value

下面的代码工作正常(Echo 是一个用户定义的函数,它接受一个字符串 returns 一个字符串):

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

但问题是我有一个配置设置,它在当前数据库中存储一个函数的名称。该函数必须采用字符串参数和 return 字符串参数。所以我不一定要调用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

但是它告诉我缩放器@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

我得到'Incorrect syntax near the keyword exec'

如何捕获 return 值并将其存储在 @ttt 中?

尊敬的 StackExchange:您的网站存在错误。我不允许输入以下评论以响应已接受的答案。

以下是对已接受答案的评论: 它有效,但我必须将 @sql 声明为: Declare @sql nvarchar(Max).

如果我没理解错的话,你想要一个输出参数:

declare @tttx varchar(max);

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

print @tttx;