Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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
Sql 执行动态查询而不显示结果_Sql_Sql Server_Tsql_Dynamicquery - Fatal编程技术网

Sql 执行动态查询而不显示结果

Sql 执行动态查询而不显示结果,sql,sql-server,tsql,dynamicquery,Sql,Sql Server,Tsql,Dynamicquery,我有一个存储过程,它返回多个检查的结果。在存储过程中,我有动态查询。第一个用于计算特定表的最后更新日期。这个查询的结果应该保存在一个变量中,我将进一步使用它作为单个值,这样我就不必每次需要时都计算它 查询如下所示: SET @lastUpdate = ' (SELECT MAX(CAST(' + @column + ' as date)) FROM ' + @schema + '.' + @table + ')' EXEC sp_executesql @lastUpdate 问题是,当我运行存

我有一个存储过程,它返回多个检查的结果。在存储过程中,我有动态查询。第一个用于计算特定表的最后更新日期。这个查询的结果应该保存在一个变量中,我将进一步使用它作为单个值,这样我就不必每次需要时都计算它

查询如下所示:

SET @lastUpdate = ' (SELECT MAX(CAST(' + @column + ' as date)) FROM ' + @schema + '.' + @table + ')'
EXEC sp_executesql @lastUpdate
问题是,当我运行存储过程时,它会返回此查询的结果(例如2021-01-31),然后返回我所做检查的结果。


所以我想做的是计算
@lastUpdate
,而不是显示结果,只是使用它。我尝试使用输出变量,但得到了相同的结果。

在字里行间阅读,我想这可能就是您想要的,使用
output
参数:

——您的动态对象
声明@Column sysname,
@模式sysname,
@表sysname;
声明@LastUpdate,--这不是你现在的动态语句,这是一个日期,就像名字所暗示的那样
@SQL nvarchar(最大值)--这是你的动态声明
将@SQL=N'从'+QUOTENAME(@Schema)+N'.'+QUOTENAME(@Table)+N'.'中选择@LastUpdate=MAX(强制转换('+QUOTENAME(@Column)+N'作为日期))
EXEC sys.sp_executesql@SQL,N'@LastUpdate date OUTPUT',@LastUpdate OUTPUT;
打印@LastUpdate--打印以证明已指定值

在字里行间阅读,我想这可能就是您想要的,带有一个
输出
参数:

——您的动态对象
声明@Column sysname,
@模式sysname,
@表sysname;
声明@LastUpdate,--这不是你现在的动态语句,这是一个日期,就像名字所暗示的那样
@SQL nvarchar(最大值)--这是你的动态声明
将@SQL=N'从'+QUOTENAME(@Schema)+N'.'+QUOTENAME(@Table)+N'.'中选择@LastUpdate=MAX(强制转换('+QUOTENAME(@Column)+N'作为日期))
EXEC sys.sp_executesql@SQL,N'@LastUpdate date OUTPUT',@LastUpdate OUTPUT;
打印@LastUpdate--打印以证明已指定值

作为旁白;为了安全起见,你应该在你的名字周围使用。我希望这些动态对象在你注入它们之前已经被消毒;否则这是一个巨大的安全漏洞。我不明白你的问题-给变量赋值永远不会输出变量本身?但是,您显示的查询不是赋值,而是选择它。因此,我认为您的SP未按预期工作。如果要使用动态SQL计算多个值以将值返回到调用上下文中,则必须使用输出参数。如果不想将数据集返回到应用层,为什么不使用
output
参数将值分配给变量?分配变量,包括使用输出参数(正确)将永远不会显示为结果。您可能需要向我们展示更多的代码,因为目前还不清楚。净化意味着使用类似于
QUOTENAME
的东西来防止SQL注入攻击。您显示的代码是一个select,它返回一个结果。您可能打算将其分配给输出参数;为了安全起见,你应该在你的名字周围使用。我希望这些动态对象在你注入它们之前已经被消毒;否则这是一个巨大的安全漏洞。我不明白你的问题-给变量赋值永远不会输出变量本身?但是,您显示的查询不是赋值,而是选择它。因此,我认为您的SP未按预期工作。如果要使用动态SQL计算多个值以将值返回到调用上下文中,则必须使用输出参数。如果不想将数据集返回到应用层,为什么不使用
output
参数将值分配给变量?分配变量,包括使用输出参数(正确)将永远不会显示为结果。您可能需要向我们展示更多的代码,因为目前还不清楚。净化意味着使用类似于
QUOTENAME
的东西来防止SQL注入攻击。您显示的代码是一个select,它返回一个结果。您可能打算将其分配给输出参数。如果我单独运行它,它会起作用,谢谢。如果我在存储过程中运行它,我会得到日期结果,然后是用于基本检查的表结果。我猜这是我从存储过程输出结果的方式。“如果我在存储过程中运行它,我会得到日期结果,然后是用于基本检查的表结果。”如果在过程中运行它,行为不会改变,@Yana。我编辑了我的问题,并添加了执行存储过程后得到的结果的屏幕截图。第一个是来自这个动态查询的行,第二个是我从usp中使用的另一个动态查询中得到的行。上面没有返回数据集@Yana。如果你得到的是价值,那么你是从其他东西中得到的。这就是当您包含您不理解的部分代码时会发生的情况,您的实现不正确,因为我们无法向您展示如何。。听起来你有另一个
选择@LastUpdate某处。不幸的是,我无法显示更多。。谢谢你的帮助。好吧,如果我一个人运行它就行了,谢谢。如果我在存储过程中运行它,我会得到日期结果,然后是用于基本检查的表结果。我猜这是我从存储过程输出结果的方式。“如果我在存储过程中运行它,我会得到日期结果,然后是用于基本检查的表结果。”如果在过程中运行它,行为不会改变,@Yana。我编辑了我的问题,并添加了执行存储过程后得到的结果的屏幕截图。第一行来自这个动态查询,第二行来自我在usp中使用的另一个动态查询