T-SQL字符串连接`'字符串'+ str(整数)`引入了额外的空格字符

And*_*kin 6 sql t-sql sql-server

对不起有点微不足道的问题,但为什么呢

select ('https://stackoverflow.com/users/' + str(Id)) as Link
from Users
where DisplayName = 'Jon Skeet';
Run Code Online (Sandbox Code Playgroud)

当进入Data Explorer返回时

https://stackoverflow.com/users/ 22656
Run Code Online (Sandbox Code Playgroud)

代替

https://stackoverflow.com/users/22656
Run Code Online (Sandbox Code Playgroud)

根据微软关于T-SQL +运营商文档,

'book' + 'case'
Run Code Online (Sandbox Code Playgroud)

应该给

'bookcase'
Run Code Online (Sandbox Code Playgroud)

'book case'
Run Code Online (Sandbox Code Playgroud)

根据Data Explorer文档,Stack Exchange Data Explorer中使用的SQL风格确实是T-SQL.


一些额外的实验:

select str(42);
Run Code Online (Sandbox Code Playgroud)

返回"42",没有额外的空格(参见下面的编辑).

select ('foo' + 'bar');
Run Code Online (Sandbox Code Playgroud)

返回"foobar",也没有空格.

select ('foo' + '42');
Run Code Online (Sandbox Code Playgroud)

返回"foo42",所以它不会特别处理数字或类似的数字.


对我来说,看起来好像违反了基本的语义成分原则.我在这里错过了什么?


编辑问题证明是错误的假设

select str(42); 
Run Code Online (Sandbox Code Playgroud)

回报"42".它实际上回来了

"        42"
Run Code Online (Sandbox Code Playgroud)

但是基于浏览器的GUI会忽略这些空格.

这是另一个更清楚地说明问题的例子:

select 'foo' + str('42'); 
Run Code Online (Sandbox Code Playgroud)

似乎回归了

"foo 42"
Run Code Online (Sandbox Code Playgroud)

但它实际上会回来

"foo        42"
Run Code Online (Sandbox Code Playgroud)

在此查询中可以看到:

select LEN('foo' + str('42')); 
Run Code Online (Sandbox Code Playgroud)

返回13(不是5,也不是6).非常感谢@ lad2025指出这一点.

因此,它主要是由于浏览器中字符串结果的某种不准确表示而导致的"视错觉".

Luk*_*zda 8

问题是STR:

返回从数字数据转换的字符数据.

STR(float_expression [,length [,decimal]])

是总长度.这包括小数点,符号,数字和空格.默认值为10.

select REPLACE(str(Id), ' ', '-')
from Users
where DisplayName = 'Jon Skeet';

OUTPUT:
-----22656
Run Code Online (Sandbox Code Playgroud)

我只想使用CONCAT:

select CONCAT('https://stackoverflow.com/users/', id) AS link
from Users
where DisplayName = 'Jon Skeet';
Run Code Online (Sandbox Code Playgroud)

见演示