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 的最终解决方案仍然是正确的:如果重要,则隐式或显式地将列强制转换或转换为所需的输出宽度,但要注意为工具输出设置的限制。
为什么这个查询会得到 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 的最终解决方案仍然是正确的:如果重要,则隐式或显式地将列强制转换或转换为所需的输出宽度,但要注意为工具输出设置的限制。