我刚回答了这个问题:Concate Primary Keys in SQL
我遇到了一个奇怪的行为:
SELECT 5 + '-' + 8
返回13
SELECT CAST('-' AS INT)
返回0,解释了上述内容......
但是:为什么一个连字符会被隐含地归零?
Btw:单个+或(多个)空白字符串也一样......
这是相关的CAST hyphen (-) to Decimal但是指出这样一个事实,即施法到十进制不会带来这些结果......
答案 0 :(得分:5)
我写这个作为答案,因为评论太长/太复杂 - 但这是基于我的评论。 还要注意 - 我没有正式的来源,所以没有确认我的逻辑是“什么实施”。 (但我觉得有道理:))
但假设您正在编写需要执行的转换函数。
所以你有一个要验证的字符串 - 例如#\w+(?<!#|$\w{6}#)
然后单独拍摄每个角色:
CAST('-50' AS INT);
所以假设字符串`-` is a valid part of the conversion, so move to next character.
`5` is a valid part of the conversion, so move to next character.
`0` is a valid part of the conversion, so move to next character.
Done.
:
CAST('-' AS INT);
现在 - 您可以进行额外的检查以使其无效,因为`-` is a valid part of the conversion, so move to next character.
Done.
不允许独立,但这需要额外的代码。
与-
和空格类似。
与货币和货币或期间和金钱一样:
+
两者都是有效字符 - 但实际上只与实际数字有关。但他们解析 - 表明这一切都是故意的,转换的速度似乎是明智的。
答案 1 :(得分:4)
这与负数和正数有关。我通过检查SELECT ISNUMERIC('-12') // Result: 1
SELECT ISNUMERIC('+12') // Result: 1
SELECT ISNUMERIC('.12') // Result: 1 (because "." can be cast to MONEY)
:
SELECT CAST('-' AS INT)
所以在你的情况下,SELECT CAST('-.' AS MONEY)
会得到“负0”。即使 <Provider alias="media" type="Our.Umbraco.FileSystemProviders.Azure.AzureBlobFileSystem, Our.Umbraco.FileSystemProviders.Azure">
<Parameters>
<add key="connectionString" value="**SECRET1**"/>
也是合法的。
答案 2 :(得分:1)
在表达式
中5 + '-'
5
是INT
类型的文字,'-'
是CHAR(1)
类型的文字。 +
将成为数字加法运算符,而不是字符串连接运算符,因为隐式地将CHAR
转换为INT
has higher priority than the other way around,这是不幸的。
将'-'
转换为INT
会产生0
,因为-
和+
是合法的数字符号,并且允许使用没有任何数字的单个符号。为什么?好吧,因为他们是。据我所知,这在任何地方都没有记录。事实上,没有一条规则。 CONVERT(MONEY, ',,,')
会产生0
,因为,
完全被忽略为数字分隔符,即使它们并未在此处分隔任何数字。 CONVERT(FLOAT, '+')
是非法的,CONVERT(DECIMAL, '+')
也是如此,但CONVERT(INT, '+')
只是花花公子。联机丛书仅包含对行为的最简短引用。如果你反向设计实现这些行为的代码,你无疑会在解析器中找到一些古老而可疑的快捷方式,这些快捷方式现在都是为了兼容而维护的。
请注意,我非常确定如果转换代码是今天编写,Microsoft会注意 会产生错误(例如{ {1}},FLOAT
或大多数其他数字类型),因为结果不必要地令人惊讶。但是我同样确定,依赖于这种转换的野外代码破坏的风险太大了。 (想象一下那里使用DECIMAL
的所有文本文件作为&#34;不适用的&#34;当前导入为0的值,现在会因错误而中断。)
答案 3 :(得分:0)
默认情况下,在这种情况下,SQL Server会尝试强制转换为表达式中所有类型中具有最高优先级的类型。 Int的优先级高于char,因此SQL Server会隐式地将'-'
强制转换为int。以下是关于SQL Server类型优先级的a documentation。