SELECT SQL变量 - 我应该避免使用这种语法并始终使用SET吗?

Mak*_*ple 9 sql t-sql sql-server

这可能看起来像一个复制到这里,但事实并非如此.我想要获得最佳实践,而不是技术性答案(我已经知道).

SQL Server的新手,并试图形成良好的习惯.
我找到了对 这里SET @var =和之间的功能差异的一个很好的解释SELECT @var =
:http: //vyaskn.tripod.com/differences_between_set_and_select.htm
总结一下另一个没有的东西(参见示例的来源):

组:

  1. ANSI和便携式,由Microsoft推荐.
  2. SET @var = (SELECT column_name FROM table_name) 当select返回多于一个值时失败,消除了不可预测结果的可能性.
  3. SET @var = (SELECT column_name FROM table_name)@var如果SELECT column_name FROM table_name返回的话将设置为NULL ,因此永远不会离开@var它的先前值.

选择:

  1. 可以在一个语句中设置多个变量
  2. 可以返回先前DML语句设置的多个系统变量
  3. SELECT @var = column_name FROM table_name将设置@var为(根据我的测试)select返回的最后一个值.这可能是一个功能或错误.可以使用SELECT @j = (SELECT column_name FROM table_name)语法更改行为.
  4. 速度.使用单个 SELECT语句而不是多个SET/SELECT语句设置多个变量快得多.他有一个样本测试来证明他的观点.如果您可以设计一个测试来证明其他情况,请将其打开!

那么,我该怎么办?

  • (几乎)总是使用SET @var =,使用SELECT @var =是凌乱的编码而不是标准.

    要么

  • 使用SELECT @var =自由,它可以为我完成更多,除非代码可能被移植到另一个环境.

谢谢

edd*_*ves 2

这是我的观点 - 使用 SET 进行简单操作,例如SET @var = 'hardcoded_value'使用 SELECT 进行欺骗性分配,例如从表中进行分配。我几乎总是以以下方式将 select 写入变量语句,以使编译器和任何其他开发人员都清楚我的意图:SELECT TOP 1 @var = col_name FROM some_table

如果我担心可移植性,我就不会编写 T-SQL,而是会坚持使用 ORM 层进行数据访问。

编辑,额外提示:在 SQL 08 中,我喜欢使用这种对于 T-SQL 来说相当简洁的语法:

DECLARE @var int = (SELECT col_name FROM some_table)