【问题标题】:Get Max +1 of VarChar Column获取 VarChar 列的 Max +1
【发布时间】:2017-09-05 04:50:24
【问题描述】:

我有一个表,其中包含名为 EMPLOYEE_CODE 的 varchar 列中的文本和数字。我想忽略所有文本并获得列中的最高数字,然后 + 1,然后我可以将其分配给新员工。下面的代码适用于 INT 列,但不适用于 VARCHAR,因为我收到以下错误:

将 varchar 值“testusercode”转换为 数据类型 int。

SELECT MAX(EMPLOYEE_CODE) + 1 as Target
FROM [COMPANY].[dbo].[USER]
WHERE EMPLOYEE_CODE + 1 NOT IN (SELECT EMPLOYEE_CODE From dbo.USER)

我猜我必须在查询中添加转换或强制转换,但不确定如何

【问题讨论】:

  • 请展示一些真实的EMPLOYEE_CODE数据,或示例
  • Hi Vec 数据如下所示 1000 1001 1002 AD1 1003 1004 AD2 1005
  • 这是一个糟糕的设计。生成(假设)这样的“唯一”值在多用户环境中不起作用,并且绝对不可扩展。改用序列或标识列

标签: sql sql-server tsql


【解决方案1】:

您可以使用 ISNUMERIC 来检查数字,获取最大值并加 1。

SELECT MAX(EMPLOYEE_CODE) + 1 as Target
FROM [COMPANY].[dbo].[USER]
WHERE  ISNUMERIC(EMPLOYEE_CODE) = 1

如果您使用的是较新版本的 SQL Server,您也可以使用

SELECT MAX(EMPLOYEE_CODE) + 1 as Target 
FROM [COMPANY].[dbo].[USER] WHERE TRY_PARSE(EMPLOYEE_CODE AS int) IS NOT NULL

同样的东西也有 TRY_CAST 和 TRY_CONVERT。您可以轻松检查哪一个适合您的目的。

https://docs.microsoft.com/en-us/sql/t-sql/functions/try-cast-transact-sql

【讨论】:

  • 你必须把'%[0-9]%'改成'[0-9]+' :)
  • @MichałTurczyn 您建议的模式不起作用。他的情况是一种特殊情况,其中值将只是像 A-Za-z 这样的文本或只有数字 0-9,没有特殊字符。如果会有值,这将是数字的混合文本,ISNUMERIC 可以简单地用于检查数字;
  • HI Amit 第一个示例返回 100,第二个示例返回错误“将 varchar 值 'TRN04' 转换为数据类型 int 时转换失败。”
  • 这意味着,您有包含混合数据的列。请仅使用第一个。也更新了答案。
  • 问题是ISNUMERIC 没有做你想做的事。由于例如根据该函数,£1d1 是数字。 (并且正确,给定函数的定义。问题在于,从实际的角度来看,给定它的定义,该函数是无用的)
猜你喜欢
  • 2016-02-25
  • 2013-01-10
  • 2011-12-09
  • 2011-02-11
  • 1970-01-01
  • 2020-08-30
  • 2015-05-12
  • 2010-12-12
  • 2013-06-17
相关资源
最近更新 更多