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

时间:2010-06-01 05:58:47

标签: sql sql-server tsql

这似乎与here重复,但事实并非如此。我想要获得最佳实践,而不是技术性答案(我已经(我认为)我知道)。

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

SET:

  1. ANSI和便携式,由Microsoft推荐。
  2. 当li返回多于一个值时,
  3. SET @var = (SELECT column_name FROM table_name)失败,从而消除了不可预测结果的可能性。
  4. SET @var = (SELECT column_name FROM table_name)会将@var设置为NULL(如果这是SELECT column_name FROM table_name返回的内容,因此永远不会将@var留在其先前值。
  5. 选择

    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语句更快。他有一个样本测试来证明他的观点。如果您可以设计一个测试来证明其他情况,请带上它!
    5. 那么,我该怎么办?

      • (差不多)总是使用SET @var =,使用SELECT @var =编码很乱而不是标准。

        或者

      • 自由使用SELECT @var =,除非代码可能移植到其他环境,否则它可以为我完成更多工作。

      由于

2 个答案:

答案 0 :(得分:2)

这是我的意见 - 使用SET进行简单操作,例如SET @var = 'hardcoded_value',并使用SELECT进行tricker分配,例如从表中进行。我几乎总是以下列方式将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)

答案 1 :(得分:0)

没有太多可说的,因为你自己提到的文章已经很好地涵盖了它。

  

标准对你很重要吗?如果   你的答案是'是',那么你应该   使用SET。

至于我自己的标准,我并不真正使用一个,这取决于行星的排列。阅读完文章后,我必须承认我对SET略有偏好。