怎样保存动态SQL (EXEC)的结果为变量,然后调用。

CTO 2015-03-22 07:55:25
例如下动态SQL (EXEC)语句:

DECLARE @table varchar(50) = 'table1'
DECLARE @condition varchar(500) =

DECLARE @sql varchar(3000) = '
select top 1 (PERCENTILE_DISC(0.60) WITHIN GROUP (ORDER BY [time]) OVER () ) AS [P60]
(select avg([time]) from @table) as AVG
from @table where @where
'
PRINT '2014'
SET @where = '[year]=''2014'''
SET @run = REPLACE(REPLACE(@sql, '@table', ''+@table+''), '@where', ''+@where+'')
EXEC(@run)

PRINT '2015'
SET @where = '[year]=''2015'''
SET @run = REPLACE(REPLACE(@sql, '@table', ''+@table+''), '@where', ''+@where+'')
EXEC(@run)

PRINT '2014*2+2015*3 P60'
--现在需要一个办法“保存” 2014 和 2015 年的P60的值,当所有计算(2014/2015)完毕后,总结做如下运算:2014(P60)*2 + 2015(P60)*3
这只是一个例子,问题的核心是保存动态SQL (EXEC)的结果为变量,然后调用。

...全文
698 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
还在加载中灬 2015-03-23
  • 打赏
  • 举报
回复
动态执行,可以实现你想要的参数的输入和输出功能,不用让你REPLACE那样的方式不规范 你可以参考一下这边,学习下,你可以掌握得更深 http://blog.163.com/zangyunling@126/blog/static/16462450520113212357892/ 如果具体地方不明,再指出来~
hepe00 2015-03-23
  • 打赏
  • 举报
回复
PRINT '2015' SET @where = '[year]=''2015''' SET @run = REPLACE(REPLACE(@sql, '@table', ''+@table+''), '@where', ''+@where+'') EXEC sp_executesql @run, N'@a int output',@num output //在哪里设置@a呢?
declare @num int,@result INT;
DECLARE @table varchar(50) = 'table1'

DECLARE @sql varchar(3000) = '
SET @result = select top 1 (PERCENTILE_DISC(0.60) WITHIN GROUP (ORDER BY [time]) OVER () ) AS [P60]
(select avg([time]) from @table) as AVG
from @table where @where'

PRINT '2015'
SET @where = '[year]=''2015'''
SET @run = REPLACE(REPLACE(@sql, '@table', ''+@table+''), '@where', ''+@where+'')
EXEC sp_executesql @run, N'@result AS INT  OUTPUT ', @result=@num output ;

SELECT @num;
hepe00 2015-03-23
  • 打赏
  • 举报
回复
使用sp_executesql 即可。
CTO 2015-03-23
  • 打赏
  • 举报
回复
这个output没有办法应用在WHERE里面,即使使用了sp_executesql还是有这个问题。 declare @num int DECLARE @table varchar(50) = 'table1' DECLARE @sql varchar(3000) = ' select top 1 (PERCENTILE_DISC(0.60) WITHIN GROUP (ORDER BY [time]) OVER () ) AS [P60] (select avg([time]) from @table) as AVG from @table where @where ' PRINT '2014' SET @where = '[year]=''2014''' SET @run = REPLACE(REPLACE(@sql, '@table', ''+@table+''), '@where', ''+@where+'') EXEC sp_executesql @run, N'@a int output',@num output //在哪里设置@a呢? PRINT '2015' SET @where = '[year]=''2015''' SET @run = REPLACE(REPLACE(@sql, '@table', ''+@table+''), '@where', ''+@where+'') EXEC sp_executesql @run, N'@a int output',@num output //在哪里设置@a呢? PRINT '2014*2+2015*3 P60' --现在需要一个办法“保存” 2014 和 2015 年的P60的值,当所有计算(2014/2015)完毕后,总结做如下运算:2014(P60)*2 + 2015(P60)*3
CTO 2015-03-22
  • 打赏
  • 举报
回复
可否根据问题给出SQL代码?多谢。
oraclecaicai 2015-03-22
  • 打赏
  • 举报
回复
用表变量接收语句输出的结果集,类似INSERT INTO @t EXEC (@run)。然后,再从表变量中把返回的内容读取出来,赋值给变量。

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧