Sql server SQL Server 2008存储过程使用ORDER BY column DESC从表的最后一行中选择列
存储过程的新特性。我有一个包含以下两列的表Sql server SQL Server 2008存储过程使用ORDER BY column DESC从表的最后一行中选择列,sql-server,sql-server-2008,stored-procedures,Sql Server,Sql Server 2008,Stored Procedures,存储过程的新特性。我有一个包含以下两列的表 ID (identity) NoPro = CCNNN where CC = Country Code and NNN sequential number within country 数据: 在存储过程中,我希望访问特定国家/地区的上一个项目,以便为该国家/地区分配下一个项目编号 我正在尝试以下代码: select @sNo = [NoPro] from projects where substring([NoPro], 1, 2) = @C
ID (identity)
NoPro = CCNNN where CC = Country Code and NNN sequential number within country
数据:
在存储过程中,我希望访问特定国家/地区的上一个项目,以便为该国家/地区分配下一个项目编号
我正在尝试以下代码:
select @sNo = [NoPro]
from projects
where substring([NoPro], 1, 2) = @Country
order by NoPro DESC
如果我对国家使用AR,我在期待AR103时得到了AR101
我错过了什么
谢谢 获取您所在国家的最大NoPro值应该可以解决您的问题,如果您更改where子句以使用,您甚至可以使用NoPro上的索引来查找您要查找的行
这里的设计在并发性方面有点麻烦,所以请至少在NoPro上创建一个唯一的约束,以防止重复
select @sNo = max(NoPro)
from projects
where NoPro like @Country+'%';
另一种解决方法是使用top:
您的查询返回多行。分配给@sNo的是任意值或最后处理的值-我不确定SQL Server是否保证这一点。在任何情况下,解决方案都是修复查询以返回一个值。请发布为NoPro生成新值的完整源代码。我想我让它比需要的更复杂:DYep,看起来像它。看起来你在第二个解决方案的where子句中使用了列别名。不,你没有,我在这里打电话,看不清楚。我刚刚比较了两个解决方案,令人尴尬的是,我的占82%,而你的占18%。这个解决方案比Mikael建议的贵了近4倍。@m.Ali。有趣的我建议这样做是因为它与OP的原始查询最为相似。我没有意识到性能会差得多。@M.Ali-显示的估计成本应该与大量盐一起承担。N=1的Topn排序和计算MAX的流聚合基本上做了相同的事情,记住了它们看到的最大值。TOP N排序实际上不会对整个输入进行排序,除非N>100,但它会像排序一样计算成本。有关该运算符的更多信息,请参阅。感谢@MartinSmith提供有用的链接。在我对执行计划和性能优化所知甚少的情况下,我通常会以两种不同的方式编写查询,比较这些查询的估计成本,然后选择最便宜的一种。我认为这是优化代码的好方法:S
select @sNo = max(NoPro)
from projects
where NoPro like @Country+'%';
select top 1 @sNo = [NoPro]
from projects
where substring([NoPro], 1, 2) = @Country
order by NoPro DESC;