下面脚本有问题,能否帮我指出哪里有问题.想用sp_executesql执行另一个存储过程应该怎么写?declare @name nvarchar(20)
set @name=N'sa'
exec sp_executesql N'sp_who @name',N'@name nvarchar(20)',@name

解决方案 »

  1.   

    declare @name nvarchar(20)
    set @name=N'sa'
    exec sp_executesql N'exec sp_who @name',N'@name nvarchar(20)',@name
      

  2.   

    declare @name nvarchar(20)
    set @name=N'sa'
    exec sp_executesql N'exec sp_who @name',N'@name nvarchar(20)',@name
      

  3.   

    谢谢,还有一种写法是:declare @name nvarchar(20)
    set @name=N'sa'
    exec sp_who @name
    如果用两种写法反复调用同一个存储过程(不一定是sp_who),请问哪一种方法性能最好?
      

  4.   

    在 SQL Server 早期的版本中要重新使用执行计划的唯一方式是,将 Transact-SQL 语句定义为存储过程然后使应用程序执行此存储过程。这就产生了管理应用程序的额外开销。使用 sp_executesql 有助于减少此开销,并使 SQL Server 得以重新使用执行计划。当要多次执行某个 Transact-SQL 语句,且唯一的变化是提供给该 Transact-SQL 语句的参数值时,可以使用 sp_executesql 来代替存储过程。因为 Transact-SQL 语句本身保持不变仅参数值变化,所以 SQL Server 查询优化器可能重复使用首次执行时所生成的执行计划。
      

  5.   

    下面是一个测试,用SqlServer2005测试,报"查询超过结果网格中可以显示的最大结果集数。网格中仅显示前 100 个结果集。"警告,怎么改进这个测试能让它既能循环1000遍,又不显示sp_executesql执行的结果集,只显示最后经历的执行时间declare @i int
    declare @begin datetime,@end datetime
    set @begin=getdate()
    set @i=0
    while @i<1000
    begin
    declare @name nvarchar(20)
    set @name=N'sa'
    exec sp_executesql N'exec sp_who @name',N'@name nvarchar(20)',@name
    set @i=@i+1
    end
    set @end=getdate();
    select datediff(millisecond,@begin,@end)
      

  6.   

    declare @name nvarchar(20)
    set @name=N'sa'
    exec sp_executesql N'exec sp_who @name',N'@name nvarchar(20)',@name
      

  7.   

    两种方法,测试时间几乎差不多,sp_executesql重新使用执行计划似乎起不到任何作用,怎么会这样呢?declare @i int
    declare @begin datetime,@end datetime
    set @begin=getdate()
    set @i=0
    while @i<1000
    begin
    --方法1:
    --declare @name nvarchar(20)
    --set @name=N'sa'
    --exec sp_executesql N'exec sp_who @name',N'@name nvarchar(20)',@name--方法2:
    declare @name nvarchar(20)
    set @name=N'sa'
    exec sp_who @name
    set @i=@i+1
    end
    set @end=getdate();
    print datediff(millisecond,@begin,@end)