存储过程SQL SELECT语句问题

时间:2010-07-15 10:36:49

标签: sql tsql sql-server-2008 stored-procedures select

我在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

的问候, 乔治

3 个答案:

答案 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。您需要或应该做的次数非常低

底线 - 你最好忘记你曾经听过它。

相关问题