当前位置: 代码迷 >> Sql Server >> 存储过程sp_executeSQL select 典故
  详细解决方案

存储过程sp_executeSQL select 典故

热度:38   发布时间:2016-04-24 20:03:50.0
储存过程sp_executeSQL select 典故
编写储存过程中有一疑问

当动态获取值的时候

declare @maxid int
declare @sqlmaxid nvarchar(max)
SET @sqlmaxid =  'SELECT   @maxid = max(id)
  FROM us
  where un= ''' + @un+ ''' 
  '
EXEC sp_executeSQL @sqlmaxid, @params = N'@maxid INT OUTPUT', @maxid = @maxid OUTPUT


但是我直接select @maxid = max(id) from us

同样能得到结果.请问上面方法各有什么不同

------解决方案--------------------
select @maxid = max(id) from us
你这是什么
你在好好看看动态的那个
那个是有where的,而且,where后面的值是传递进来的,所以,知道了吧?
------解决方案--------------------
如果where条件是动态的话,你单纯那句是实现不了的,记住——动态
------解决方案--------------------
这一句通常这样写

declare @maxid int
    declare @sqlmaxid nvarchar(max)
    SET @sqlmaxid =  'SELECT   @maxid = max(id)
                      FROM us
                      where un=@un 
                      '
    EXEC sp_executeSQL @sqlmaxid, @params = N'@maxid INT OUTPUT,@un varchar(30)', @maxid = @maxid OUTPUT,@un=@un

这种是标准的参数化查询,可以将查询计划重用
而你上面那样拼接语句的话,是达不到重用效果的

select @maxid = max(id) from us where un=@un 
其实这也算是参数化查询了
  相关解决方案