如何将 sp_executesql 结果放入变量中?
我需要执行一段动态 SQL,然后需要将结果存储到变量中。
我知道我可以使用 sp_executesql,但找不到有关如何执行此操作的明确示例。
I have a piece of dynamic SQL I need to execute, I then need to store the result into a variable.
I know I can use sp_executesql
but can't find clear examples around about how to do this.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
如果您有 OUTPUT 参数,则可以执行此操作
,但如果没有,则无法修改 SP:
不太漂亮,但可以。
If you have OUTPUT parameters you can do
But if you don't, and can not modify the SP:
Not pretty, but works.
如果您想返回超过 1 个值,请使用以下命令:
返回值位于 @retIndex 和 @retText 中
If you want to return more than 1 value use this:
returned values are in @retIndex and @retText
返回值通常不用于“返回”结果,而是返回成功(0)或错误号(1-65K)。 以上似乎表明 sp_executesql 没有返回值,这是不正确的。 sp_executesql 将返回 0 表示成功,返回任何其他数字表示失败。
在下面,@i 将返回 2727
SSMS 将显示这一点
消息 2727,11 级,状态 1,第 1 行
找不到索引“NonExistantStaticsName”。
Return values are generally not used to "return" a result but to return success (0) or an error number (1-65K). The above all seem to indicate that sp_executesql does not return a value, which is not correct. sp_executesql will return 0 for success and any other number for failure.
In the below, @i will return 2727
SSMS will show this
Msg 2727, Level 11, State 1, Line 1
Cannot find index 'NonExistantStaticsName'.
这对我有用:
This worked for me:
您可以尝试以下方法
Here's something you can try
本文中的大多数答案都容易受到 SQL 注入的攻击,因为它们将输入变量直接连接到 SQL 脚本中。 如果您使用没有动态代码的存储过程,这不是问题,但如果您使用动态 sql,即使存储过程也可能容易受到攻击。 动态sql是指sql脚本在存储过程内部编译或者作为参数传递给存储过程; 因此每次执行存储过程时都会重新编译。
为了保护自己免受 sql 注入的影响,您的输入值还必须通过参数引入到 sql 中。
下面是三个示例 - 最后两个使用存储过程。 第一个存储过程 (example-2) 不使用动态构建的 sql 字符串,而第二个存储过程 (example-3) 使用动态构建的 SQL 字符串。
Most answers in this post are vulnerable to sql injection, because they concatenate the input variables directly into the sql script. This is not a problem if you use a stored procedure without dynamic code, but even a stored procedure can be vulnerable if you use dynamic sql. Dynamic sql means that the sql script is compiled inside the stored procedure or passed to the stored procedure as a parameter; and thus newly compiled every time the stored procedure executes.
To protect yourself against sql injections, your input values must ALSO be introduced to the sql via parameters.
Here are three examples - the last two using stored procedures. The first stored procedure (example-2) does not use a dynamically built sql string, while the second stored procedure (example-3) does.
这是很久以前的事了,所以不确定是否仍然需要,但您可以使用 @@ROWCOUNT 变量来查看有多少行受到先前 sql 语句的影响。
例如,当您构造动态 Update 语句并使用 exec 运行它时,这很有用。 @@ROWCOUNT 将显示更新了多少行。
定义如下
This was a long time ago, so not sure if this is still needed, but you could use @@ROWCOUNT variable to see how many rows were affected with the previous sql statement.
This is helpful when for example you construct a dynamic Update statement and run it with exec. @@ROWCOUNT would show how many rows were updated.
Here is the definition