执行动态sql语句时,返回参数值
以前一直用临时表的方法,好笨蛋。。。
今天对一个分页的存储过程估计了一下执行计划,光是用临时表取符合条件的总记录数时,开销就占60%,然后呢,从临时表里select出总记录数,又占开销20%,剩下从表里面返回数据又占20%开销,然后呢,我的存储过程的100%开销就分完了
看到我眼睛都绿了,从来没有想到会这样子,笨蛋笨蛋笨蛋,大大的大笨蛋,就是我了
下面是以前的笨蛋办法
select @sql = 'select count(OrderID) from ' + @tableName + @item
execute(@sql)
create table #temp (row int)
insert into #temp ( row ) execute(@sql)
select @rowsCount = row from #temp
drop table #temp
select @rowsCount as rowsCount, @pageSize as pageSize, @page as pageIndex,
pageCount = case @rowsCount % @pageSize when 0 then @rowsCount / @pageSize else @rowsCount / @pageSize + 1 end
啊,这个办法我还要用了这么久,真笨蛋
今天解决这个问题了,用sp_executesql接收执行动态sql语句时返回的参数,方法如下
set @sql = 'select @RowsCount_Opuput = COUNT(*) from SalesLT.Product where ProductCategoryID = @CategoryID and Color = @Color'
set @sqlParm =
'@CategoryID int, @Color varchar(20), @RowsCount_Opuput int output'
exec sp_executesql @sql, @sqlParm, @CategoryID = 18, @Color = 'Black', @RowsCount_Opuput = @RowsCount output
select @RowsCount
上面这段代码用的是ms sql 2008的示例数据库AdventureWorksLT2008数据库,相同方法在sql2000下可以使用的,郁闷,以前为什么就没有不知道用sp_executesql呢?
exec sp_executesql的参数,第一个是要执行的动态命令,第二个是动态命令里用到的参数声明,第三个开始,是动态命令里用到的参数的值,如果要返回,加上output就可以了
几简单的方法啊,郁闷,以前好笨蛋