我使用的是SQL Server,并且有一个包含以下列的Users表:
Sr. (int), civil_id (varchar), fname etc 我想要实现的是在我的用户表中有序地插入civil_id,比如100、101等等
为此,我尝试使用TOP1和order by获取最后一行的civil_id (varchar类型),并在下一次用户插入时将其递增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类型。

发布于 2020-06-27 13:58:49
总体而言,你的问题在我看来是正确的,尽管有一些混淆。让我们给出一些你可以改进的建议-
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更改值来检查它
现在,当@ that中的值按预期生成时,可以通过检查"sr= 299“来询问您基本上更新了哪一行,然后选择哪一行来检查相应更新的值。如果您正在更新正确的行/秒,值应该是正确的,并且@civer值的生成没有问题。
https://stackoverflow.com/questions/62606267
复制相似问题