读书人

存储过程sp_executeSQL select 典故

发布时间: 2013-10-31 12:03:52 作者: rapoo

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

读书人网 >SQL Server

热点推荐