SQL局部变量

时间:2013-12-05 09:29:32

标签: sql sql-server tsql sql-server-2005

我正在编写一个SQL脚本,突然对以下行感到困惑:

IF EXISTS(SELECT @IDTTIC = IDTTIC TOP 1 * FROM @ProblemTickets)

其中@ProblemTickets是我的表变量。

上述条件是否写得好还是应该是这样的:

IF EXISTS(SELECT TOP 1 @IDTTIC = IDTTIC FROM @ProbelmTickets)

2 个答案:

答案 0 :(得分:2)

IF EXISTS(SELECT  * FROM @ProblemTickets)
  BEGIN
     SELECT TOP 1 @IDTTIC = IDTTIC FROM @ProblemTickets
  END

存在子句检查某些东西的存在,如果确实存在,它将返回true,如果它不存在,它将返回false,但是你不能在Exists子句中返回数据。

您可以尝试我上面显示的

  

1-检查是否存在第1项。

     

2-如果存在,则获取变量中的前1个值。

* Aaron Bertrand的建议*

您可以简单地为变量赋值而不检查是否存在1st,如果表中有任何数据,则值将分配给变量,否则变量保持为NULL。

当为SELECT语句中的变量赋值时,确保SELECT只返回一行,如果显然你已经在执行SELECT TOP 1但是要获得“Right TOP 1”行,你应该使用ORDER BY子句作为好。 此外,在SELECT中为变量赋值时,您无法同时检索数据,如果SELECT返回多个列,则所有重新调整的值都应存储在变量中

像这样......

SELECT TOP 1 @Var1 = Col1,  @Var2 = Col2, @Var3 = Col3
FROM TABLE_Name
ORDER BY Some_Column

你不能做这样的事情

SELECT TOP 1 @Var1 = Col1,  @Var2 = Col2,  Col3
FROM TABLE_Name
ORDER BY Some_Column

答案 1 :(得分:0)

我个人认为应该只是:

SELECT TOP (1) @IDTTIC = IDTTIC FROM @ProblemTickets ORDER BY <something>;

如果表中有任何行,则将填充该值(当然,除非该列可以为NULL)。如果没有行,则变量仍为NULL。

无需说IF EXISTS然后将变量与另一个SELECT分配。你只是读了两次而不是一次,没有充分的理由。