操作期间赋值时sql order by子句受影响

p1tboqfb  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(369)

我正在使用sql server,并且有一个 Users 包含以下列的表:

Sr. (int), civil_id (varchar), fname etc

我要做的是有序地插入 civil_id 在我的用户表中说100101,等等
为了这个目的,我正试图 civil_id ( varchar 使用top 1和order by键入最后一行的)并将其递增1以供下次用户插入。

ALTER PROCEDURE [dbo].[check123]                               
AS 
     SET NOCOUNT ON 
     BEGIN

     DECLARE @civic int='';

     SELECT TOP 1 @civic = CONVERT(INT, civil_id) 
     FROM Users  
     ORDER BY Sr DESC;

     // just an example here  
     UPDATE Users
     SET civil_id = @civic + 1 
     WHERE Sr = 299
     //old civil_id was 10000 but after update it is 11  
END

但问题是当我在给

@civic = CONVERT(INT, civil_id) FROM Users

我没有得到我想要的 civil_id ,事实上它根本不排序,而是给出0或其他输出。
我的 civil_id 列为 varchar 不是 int 所以我转换了,但我认为它仍然在考虑ascii值
有什么建议吗?
注意:我无法更改的列类型 civil_idint 因为已经有太多的存储过程将其视为 varchar 类型。

eqfvzcg8

eqfvzcg81#

总的来说,你的问题在我看来是正确的,尽管有一些困惑。让我们建议一些你可以做的改进-

ALTER PROCEDURE [dbo].[check123]                               
AS 
 SET NOCOUNT ON 
 BEGIN

 -- DECLARE @civic int='';
 -- Do not need to assign a blank string which is VARCHAR by default to a 
 -- Integer type variable. You can simply Declare the variable as below-
 DECLARE @civic INT

 SELECT TOP 1 @civic = CONVERT(INT, civil_id) + 1
 -- Directly generate the desired value by adding +1 as shown above
 -- Now your  declared variable @civic contains the final value you wants.
 FROM Users  
 ORDER BY Sr DESC;

 // just an example here  
 UPDATE Users
 SET civil_id = @civic
 WHERE Sr = 299
 //old civil_id was 10000 but after update it is 11  
 -- Not sure what you are checking here by sr = 299
END

对于上面的查询(基本上是您的查询),我总是得到预期的结果,您可以在这里通过使用不同的输入demo更改值来检查它
现在,由于@civic中的值是按预期生成的,通过检查“sr=299”来询问您基本上更新的是哪一行,然后选择哪一行来检查是否相应地更新了值。如果您正在更新正确的行,那么值应该是正确的,并且@civic value generation没有问题。

相关问题