【问题标题】:SQL Order by clause affected when assigned value during operation操作期间赋值时影响 SQL Order by 子句
【发布时间】:2020-06-27 05:27:17
【问题描述】:

我正在使用 SQL Server,并且有一个包含这些列的 Users 表:

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

我想要实现的是在我的用户表中有序插入civil_id,比如 100,101 等

为此,我尝试使用 top 1 获取最后一行的 civil_idvarchar 类型),并为我的下一个用户插入排序并递增 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_id 的列类型更改为int,因为已经有太多存储过程将其视为varchar 类型。

【问题讨论】:

  • 在 INT 和 VARCHAR 列上的顺序将不会返回相同的结果。请添加一些示例数据,以便我们提供帮助。
  • 添加了请看一下
  • 你能告诉我们更多关于什么是“sr=299”吗?
  • sr 实际上是 int 类型的主键,在进入 db 时会自动递增

标签: sql sql-server database sql-order-by variable-declaration


【解决方案1】:

您的所有问题对我来说似乎都是正确的,尽管存在一些混淆。让我们提出一些您可以执行的改进建议-

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 HERE

现在,随着@civic 中的值按预期生成,问题通过检查“sr = 299”来提出您基本上更新了哪一行,然后您选择了哪一行来检查相应更新的值与否。如果您正在更新正确的行/s,则值应该是正确的,并且@civic 值生成没有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    相关资源
    最近更新 更多