Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 获取子字符串,将其强制转换为int,增加它并对其进行concat_Sql Server_Tsql - Fatal编程技术网

Sql server 获取子字符串,将其强制转换为int,增加它并对其进行concat

Sql server 获取子字符串,将其强制转换为int,增加它并对其进行concat,sql-server,tsql,Sql Server,Tsql,这应该实现的是获得列NR的最大数目,该列前面有一个~ 这似乎适用于10以下的数字。但是一旦我在XY中有一个条目,其中NR是~10,它总是返回相同的结果,我似乎不知道为什么。因此,我认为以下是该声明的细目: 从内到外: 首先,我得到最大数长度的子串,该子串前面有一个从位置2开始的NR的波浪线(仅为数字),以便忽略波浪线 然后我增加数字并将其作为字符串处理 最后,我准备了一块瓷砖,并对其进行了处理。在我看来,这应该达到预期的产出 表XY: 身份证件 天然橡胶 11 ~1 12 ~2 13 ~3 14

这应该实现的是获得列NR的最大数目,该列前面有一个
~

这似乎适用于10以下的数字。但是一旦我在XY中有一个条目,其中NR是~10,它总是返回相同的结果,我似乎不知道为什么。因此,我认为以下是该声明的细目:

从内到外:

首先,我得到最大数长度的子串,该子串前面有一个从位置2开始的NR的波浪线(仅为数字),以便忽略波浪线

然后我增加数字并将其作为字符串处理

最后,我准备了一块瓷砖,并对其进行了处理。在我看来,这应该达到预期的产出

表XY:

身份证件 天然橡胶 11 ~1 12 ~2 13 ~3 14 ~4 15 ~5 16 ~6 17 ~7 18 ~8 17 ~9 18 ~10
根据您的描述,
NR
是一个字符串。虽然您正在强制转换为
int
,但似乎有些地方出了问题。我建议将查询简化为以下内容:

select 
    CONCAT('~', (cast (ISNULL((select substring(max(NR), 2, len(max(NR)) - 1)   
                               from XY 
                               where left(NR, 1) = '~'), 0) AS int) + 1))
请注意,存储编码在字符串中的整数通常不是一个好主意。为什么不使用
identity()
列或序列存储一个整数呢


是一个dbfiddle。

通常最好使用适当的日期类型存储各个元素,并将构造格式化字符串的任务留给计算列(或表示层)而不是存储一个格式化的值,然后必须撤消格式化才能再次使用元素。@Damien_the_unsiver是的,这肯定是一个设计缺陷。但是,业务逻辑需要向用户提供实体的临时名称。此解决方案在GUI端的工作量更少。至少对我来说是这样。
select concat('~',
              coalesce(max(cast(stuff(nr, 1, 1, '') as int)) + 1, 1)
             ), stuff(max(nr), 1, 1, ''), max(nr)
from XY
where nr like '~%';