Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-sql,运行名称存储在字符串变量中的函数…使用类似exec的东西…并捕获返回值_Sql_Function_Tsql_Dynamic Sql - Fatal编程技术网

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

T-sql,运行名称存储在字符串变量中的函数…使用类似exec的东西…并捕获返回值,sql,function,tsql,dynamic-sql,Sql,Function,Tsql,Dynamic Sql,以下代码工作正常(Echo是一个用户定义的函数,它接受一个字符串并返回一个字符串): 但问题是,我有一个配置设置,用于在当前数据库中存储函数名。函数必须接受字符串参数并返回字符串参数。所以我不一定要调用dbo.Echo。但我想调用配置的任何东西 所以我想做的是这样的: Declare @ttt varchar(max) = '' Declare @sql varchar(Max) Declare @func varchar(Max) Declare @par varchar(max) set @

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

但问题是,我有一个配置设置,用于在当前数据库中存储函数名。函数必须接受字符串参数并返回字符串参数。所以我不一定要调用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:您的网站上有一个bug。我不允许对接受的答案发表以下评论

以下是对公认答案的评论: 它可以工作,但我必须将@sql声明为:declare@sql nvarchar(Max)。

如果我理解正确,您需要一个输出参数:
在我将sql设置为nvarchar(max)之后,它就可以工作了。我不太明白为什么ttt=ttt输出;在语法上是必需的。。。。所以我不太明白它的目的,但它是必需的,而且是有效的。如果我在这条评论中加了一个,我就不允许发布…@HillOfBeans如果你有at登录代码,例如
@ttt=@ttt output
,它就可以工作。单击注释框右侧的
帮助
,查看小减价详细信息。使用
@ttt
作为变量(在第一行中声明)和
sp_executesql
的参数会带来一些混乱。在
@ttt=@ttt output
中,左侧是参数,右侧是接收输出的变量。请看一下位于@HillOfBeans的示例C。这恰好是将参数传递到存储过程中的语法。第二个参数定义了参数的类型。第三个指定值(输入和输出)。我编辑了答案,因为它会让人困惑@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
declare @tttx varchar(max);

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

print @tttx;