SQL Server:获取列中最长值的大小,并将列名包含在该总数中

SQL Server:获取列中最长值的大小,并将列名包含在该总数中,sql,sql-server,reporting-services,ssrs-2016,Sql,Sql Server,Reporting Services,Ssrs 2016,我有一个查询,返回它在该列中找到的最长单词的数目: SELECT MAX(LEN(id)) AS id, MAX(LEN(linkToTbl2)) AS linkToTbl2, MAX(LEN(description)) AS description, MAX(LEN(number)) AS number, MAX(LEN(line)) AS line, MAX(LEN(network)) AS network, MAX(LE

我有一个查询,返回它在该列中找到的最长单词的数目:

SELECT 
    MAX(LEN(id)) AS id, 
    MAX(LEN(linkToTbl2)) AS linkToTbl2, 
    MAX(LEN(description)) AS description, 
    MAX(LEN(number)) AS number, 
    MAX(LEN(line)) AS line, 
    MAX(LEN(network)) AS network, 
    MAX(LEN(type)) AS type, 
    MAX(LEN(IPhase)) AS IPhase, 
    MAX(LEN(environment)) AS environment, 
    MAX(LEN(sType)) AS sType, 
    MAX(LEN(bDescription)) AS bDescription
FROM 
    bLine
但是,如果所述列小于该列的标题,则在计算最大值时不考虑该标题

示例(我希望做的事情):

在示例查询中如下所示:

|id |linkToTbl2 |description |
+---+-----------+------------+
|2  |10         |25          |
现在这就是我的SSRS报告中当前的情况:

|id |lin|description              |
|   |kTo|                         |
|   |tbl|                         |
|   |2  |                         |
|---|---|-------------------------|
|14 |hi |This is just a demo.     |
|16 |baa|Another description here.|
这在查询中看起来像这样:

|id |linkToTbl2 |description |
|---|-----------|------------|
|2  |3          |25          |
请注意
linkToTbl2
字段是如何压缩的,因为该列中的最长值是3(baa)
linkToTbl2
将是10(linkToTbl2),因此它应该是10而不是3


如何将列名添加到查询中以同时计算?

如果列都是字符串,则可以使用蛮力:

select . . .
from ((select id, linkToTbl2, . . . from bLine) union all
      (select 'id', 'linkToTbl2', . . .)
     ) b;

在SQL中采用的任何方法都需要列出所有列名。我认为这最好在应用层完成。

您可以使用
UNPIVOT
PIVOT

DECLARE @MyTable TABLE (id INT,  linkToTbl2 VARCHAR(100),  description  VARCHAR(100))
INSERT INTO @MyTable VALUES
(14,'hi','This is just a demo.'),
(16,'baa','Another description here.')


SELECT * FROM 
    ( SELECT 
        Col,  
        MAX(CASE WHEN LEN(Val) > LEN(Col) THEN LEN(Val) ELSE LEN(Col) END) LEN_OF_COL  
      FROM 
        ( SELECT 
                CONVERT(VARCHAR(MAX),[Id]) [Id], 
                CONVERT(VARCHAR(MAX),[linkToTbl2]) [linkToTbl2], 
                CONVERT(VARCHAR(MAX),[description]) [description] 
            FROM @MyTable ) SRC
        UNPIVOT (Val FOR Col IN( [Id], [linkToTbl2], [description] ) ) UNPVT
    GROUP BY Col ) T 
PIVOT( MAX(LEN_OF_COL) FOR Col IN ( [Id], [linkToTbl2], [description] ) ) PVT
结果:

Id          linkToTbl2  description
----------- ----------- -----------
2           10          25

您不能在应用程序级别执行此操作吗?这似乎更简单。@GordonLinoff这样做更容易,但在我目前的情况下,最好通过查询来完成。我使用UNION、INTERSECT或EXCEPT运算符组合所有查询,它们的目标列表中必须有相同数量的表达式。@StealthRT。然后显式列出列。我得到了这个错误:列“linkToTbl2”的类型与UNPIVOT列表中指定的其他列的类型冲突。所有列都应该是相同的类型。我做了一个更新就是这样做的。谢谢你的帮助,塞尔坎!我想知道为什么您需要这个,而原始查询不起作用?@JuanCarlosOropeza它起作用,但不考虑计数中的列名称。
Id          linkToTbl2  description
----------- ----------- -----------
2           10          25