我正在编写一个SQL脚本,突然对以下行感到困惑:
IF EXISTS(SELECT @IDTTIC = IDTTIC TOP 1 * FROM @ProblemTickets)
其中@ProblemTickets
是我的表变量。
上述条件是否写得好还是应该是这样的:
IF EXISTS(SELECT TOP 1 @IDTTIC = IDTTIC FROM @ProbelmTickets)
答案 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
分配。你只是读了两次而不是一次,没有充分的理由。