SUBSTRING 不限制字符串长度。指定32,得到256

SUBSTRING does not limit string length. Specified 32, got 256

为什么这个查询会得到 256 个字符的节点名称?我已应用 SUBSTRING() 将其限制为 32。

SELECT
    SUBSTRING(CONVERT(VARCHAR(MAX), NodeName),1,32) AS NODENAME
    ,LEN(SUBSTRING(CONVERT(VARCHAR(MAX), NodeName),1,32))
    ,SUBSTRING(CONVERT(VARCHAR(MAX), SERVERPROPERTY('ComputerNamePhysicalNetBIOS')),1,32) AS CURRENT_OWNER
FROM sys.dm_os_cluster_nodes;

更新:

数据将来自此查询 运行 所在的机器。这是结果。我希望线条不超过屏幕宽度。我正在尝试将名称限制为 32 个字符。

PS C:\> sqlcmd -S DBINSTANCENAME
1> SELECT
2>     SUBSTRING(CONVERT(VARCHAR(MAX), NodeName),1,32) AS NODENAME
3>     ,LEN(SUBSTRING(CONVERT(VARCHAR(MAX), NodeName),1,32))
4>     ,SUBSTRING(CONVERT(VARCHAR(MAX), SERVERPROPERTY('ComputerNamePhysicalNetBIOS')),1,32) AS CURRENT_OWNER
5> FROM sys.dm_os_cluster_nodes;
6> GO
NODENAME                                                                                                                                                                                                                                                                              CURRENT_OWNER                                                                                                                                                         
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ANODESQL78D                                                                                                                                                                                                                                                                    15 TX102WPD2SQL78C                                                                                                                                                       
ANODESQL78C                                                                                                                                                                                                                                                                    15 TX102WPD2SQL78C                                                                                                                                                       

(2 rows affected)

原因是因为您有一个 CONVERT 正在将列更改为 varchar(MAX)。在 varchar(MAX) 上使用 SUBSTRING 时,return 数据类型是 varchar(MAX)MAX 长度数据被视为与数字长度不同的数据类型,并且 SQL 当不涉及其他数据类型时,服务器不会在两者之间隐式转换。

解决方法很简单,不要CONVERT值到MAX长度:

thom@ptah:~$ sqlcmd -Q "SELECT SUBSTRING(CONVERT(nvarchar(256), NodeName),1,32) AS NODENAME, LEN(SUBSTRING(CONVERT(nvarchar(256), NodeName),1,32)) ,SUBSTRING(CONVERT(nvarchar(256), SERVERPROPERTY('ComputerNamePhysicalNetBIOS')),1,32) AS CURRENT_OWNER FROM sys.dm_os_cluster_nodes;"
NODENAME                                     CURRENT_OWNER                   
-------------------------------- ----------- --------------------------------

(0 rows affected)

sqlcomd Utility 脚本变量的默认值为 256 SQLCMDMAXVARTYPEWIDTH 它将根据返回的数据类型的最大宽度给出一列 header 宽度,直至达到此限制.

Substring returns 与输入表达式相同的数据类型 - varchar(max) 在你的情况下 - 除了少数例外。

我的猜测是您没有设置此选项,因此对于大于该值的任何字符数据类型,您将获得 256 个字符 header。 You can change it 在命令中使用 -y 选项。同样,如果您在 SQL Server Management Studio 中 运行,请使用 SSMS 选项对话框:

Tools > Options > Query Results > SQL Server > Results to Text > "Maximum number of characters displayed in each column:"

@Larnu 的最终解决方案仍然是正确的:如果重要,则隐式或显式地将列强制转换或转换为所需的输出宽度,但要注意为工具输出设置的限制。