0

我目前正在编写一个存储过程,它为调用应用程序提供有效城市和州值的检索。
当提供 zip_code 时,存储过程将返回指定输入参数的所有有效城市/州组合的列表。
但是,如果 zip_code 不存在,则存储过程必须返回错误字符串“ZipCode Wrong!” 返回到调用应用程序而不是空数据集。
我考虑了两种方法:

第一种方法

SELECT City, State FROM ZipCodeTable WHERE Zip = @ZipCode
IF (@@ROWCOUNT = 0)
return 'ZipCode Wrong!'

第二种方法

SELECT COALESCE(  
               (SELECT City, State FROM ZipCodeTable WHERE Zip=@ZipCode FOR XML PATH ('')),
               (SELECT 'ZipCode Wrong!') FOR XML PATH (''))

由于此事务每秒将运行很多次,我想让它尽可能高效。从性能的角度来看,哪个更有效?另外,如果还有其他更好的方法,请随时告诉我。谢谢!

4

4 回答 4

1

也许你不使用 aCOUNT也不使用 aSELECT因为一个计算你的结果,另一个返回一个集合。

真的是想问它是否存在......那么为什么不使用用于该目的的条款呢?

EXISTS
http://msdn.microsoft.com/en-us/library/ms188336.aspx

相反,如果您想要返回结果(如果存在),如果不存在则返回错误消息,那么@@ROWCOUNT可能会更快......您应该使用分析器对其进行基准测试。

不过,请考虑您的用例。您是否期望更多的错误和有效的回报?如果是这样,那么EXISTS作为过滤器的语法可能会更好......如果您期望更多的有效返回,那么SELECTwith@@ROWCOUNT可能是首选。

对于这个,答案非常直接:这取决于

你用的是什么数据库?也许有一种特定于实现的方法。

于 2012-06-29T18:40:24.743 回答
0

IF Then 分支一般需要更多时间,COALESCE 更容易让你的处理器优化。

也就是说,它们可能会以相同的速度运行,我会加快测试这两种解决方案的速度。

于 2012-06-29T18:27:27.283 回答
0

不需要时不要创建整个结果,只需数一下即可:

declare @cnt int
select @cnt = count(*) from ZipCodeTable where Zip = @ZipCode
if (@cnt) begin
  return 'ZipCode Wrong!'
end
于 2012-06-29T18:31:12.940 回答
0

我认为你应该在应用层处理这个问题。查看返回的行数并以这种方式检测错误。比 SQL 解决方案更快、更简单、更简洁。

于 2012-06-29T18:39:50.143 回答