日期:2014-05-17  浏览次数:20572 次

储存过程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 
其实这也算是参数化查询了