sp_executesql [对sqlserver系统存储过程的一点感悟]
sp_executesql
执行可以多次重用或动态生成的 Transact-SQL 语句或批处理。Transact-SQL 语句或批处理可以包含嵌入参数。
[具体可参考SQL Server联机帮助]
这里想说的是一个具体的应用。当从带变量的表名里获取一个字段内容时,可以用这个语句实现。在以前我都是用游标实现的。举例:declare @tabn varchar(30),@count int
declare @nsql nvarchar(1000) --这里注意数据类型必须是nvarchar
set @tabn='authors' --使用pubs数据库
set @nsql='select @count=count(1) from '+@tabn
exec sp_executesql @nsql,N'@count int output',@count output
select @count
这样就能获取到@count的值。
用游标实现:
declare @tabn varchar(30),@count int
declare @sql varchar(1000)
set @tabn='authors' --使用pubs数据库
set @sql='declare cur_1 cursor for select count(1) from '+@tabn
exec(@sql)
open cur_1
fetch next from cur_1 into @count
close cur_1
deallocate cur_1
select @count
因游标消耗太多资源,尽量少用游标。
执行可以多次重用或动态生成的 Transact-SQL 语句或批处理。Transact-SQL 语句或批处理可以包含嵌入参数。
[具体可参考SQL Server联机帮助]
这里想说的是一个具体的应用。当从带变量的表名里获取一个字段内容时,可以用这个语句实现。在以前我都是用游标实现的。举例:declare @tabn varchar(30),@count int
declare @nsql nvarchar(1000) --这里注意数据类型必须是nvarchar
set @tabn='authors' --使用pubs数据库
set @nsql='select @count=count(1) from '+@tabn
exec sp_executesql @nsql,N'@count int output',@count output
select @count
这样就能获取到@count的值。
用游标实现:
declare @tabn varchar(30),@count int
declare @sql varchar(1000)
set @tabn='authors' --使用pubs数据库
set @sql='declare cur_1 cursor for select count(1) from '+@tabn
exec(@sql)
open cur_1
fetch next from cur_1 into @count
close cur_1
deallocate cur_1
select @count
因游标消耗太多资源,尽量少用游标。