首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

存储过程sp_executeSQL select 典故

2013-10-31 
储存过程sp_executeSQLselect 典故编写储存过程中有一疑问当动态获取值的时候declare @maxid intdeclare @

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

热点排行