Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2008存储过程使用ORDER BY column DESC从表的最后一行中选择列_Sql Server_Sql Server 2008_Stored Procedures - Fatal编程技术网

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;