我在Windows Server 2008 Enterprise上使用SQL Server 2008 Enterprise。在存储过程中,我们可以直接执行SELECT语句。它也可以用这种新的方式执行,我想知道哪种方法更好,为什么?
新方法,
declare @teststatement varchar(500)
set @teststatement = 'SELECT * from sometable'
print @teststatement
exec (@teststatement)
传统方法,
SELECT * from sometable
的问候, 乔治
答案 0 :(得分:2)
仅供参考:它不是一种新方法,它被称为动态SQL。
当我们需要将某些值设置或连接到sql语句时,首选动态SQL。
建议使用传统或普通方式的sql语句,因为符合存储过程。 在首次运行时遵循 "Stored Procedure are Compiled on First Run" ,在编译时正在创建语句的执行计划。
创建执行计划时会忽略动态sqls,因为它被视为字符串(声明为VARCHAR或NVARCHAR)。
有关动态查询和存储过程的更多详细信息,请参阅以下文章
Introduction to Dynamic SQL Part 1
Introduction to Dynamic SQL Part 2
Everything you wanted to know about Stored Procedures
答案 1 :(得分:1)
传统方法更安全,因为在保存查询时会解析查询。 “exec”方法中的查询未被解析,可能包含错误。
答案 2 :(得分:0)
如上所述,“新”方式与SQL 2008无关。EXEC已经有一段时间了。在大多数情况下,它也是一个非常糟糕的主意。
您失去了参数化 - 这意味着您现在容易受到SQL Injection的攻击。它很丑陋,容易出错。它的效率较低。它创建了一个新的执行范围 - 意味着它不能共享变量,临时表等 - 从它调用存储过程。
sp_executesql是执行动态SQL的另一种(也是首选)方法。这是您的客户端应用程序使用的,它支持参数 - 这解决了EXEC最明显的问题。但是,它在存储过程中的用例非常有限。关于唯一的兑换用途是当您需要动态表或列名称时。 T-SQL不支持变量 - 所以你需要使用sp_executesql。您需要或应该做的次数非常低。
底线 - 你最好忘记你曾经听过它。