现在你的代码是创建和执行该语句:
SELECT [Column],[Count]
FROM
(
SELECT
datalength([ParentID]) as [ParentID] ,
datalength([Content]) as [Content],
datalength([Intermediate]) as [Intermediate] ,
datalength([SnapshotDataID]) as [SnapshotDataID] ,
datalength([LinkSourceID]) as [LinkSourceID],
datalength([Property]) as [Property],
datalength([Description]) as [Description],
datalength([Hidden]) as [Hidden],
datalength([MimeType]) as [MimeType],
datalength([SnapshotLimit]) as [SnapshotLimit],
datalength([Parameter]) as [Parameter],
datalength([ExecutionTime]) as [ExecutionTime],
datalength([SubType]) as [SubType],
datalength([ComponentID]) as [ComponentID]
FROM **<YOUR TABLE>**
) AS p
UNPIVOT
(
[Count] for [Column] IN
(
[ParentID] ,[Content] ,[Intermediate] ,[SnapshotDataID] ,[LinkSourceID] ,[Property] ,[Description] ,
[Hidden] ,[MimeType] ,[SnapshotLimit] ,[Parameter] ,[ExecutionTime] ,[SubType] ,[ComponentID]
)
) AS unpvt
我认为你正在寻找的是创建这样的动态SQL语句:
SELECT [column], [count] = MAX([count])
FROM
(
SELECT [Column],[Count]
FROM
(
SELECT
datalength([ParentID]) as [ParentID] ,
datalength([Content]) as [Content],
datalength([Intermediate]) as [Intermediate] ,
datalength([SnapshotDataID]) as [SnapshotDataID] ,
datalength([LinkSourceID]) as [LinkSourceID],
datalength([Property]) as [Property],
datalength([Description]) as [Description],
datalength([Hidden]) as [Hidden],
datalength([MimeType]) as [MimeType],
datalength([SnapshotLimit]) as [SnapshotLimit],
datalength([Parameter]) as [Parameter],
datalength([ExecutionTime]) as [ExecutionTime],
datalength([SubType]) as [SubType],
datalength([ComponentID]) as [ComponentID]
FROM **<YOUR TABLE>**
) AS p
UNPIVOT
(
[Count] for [Column] IN
(
[ParentID] ,[Content] ,[Intermediate] ,[SnapshotDataID] ,[LinkSourceID] ,[Property] ,[Description] ,
[Hidden] ,[MimeType] ,[SnapshotLimit] ,[Parameter] ,[ExecutionTime] ,[SubType] ,[ComponentID]
)
) AS unpvt
) x
GROUP BY [column]
要动态创建这个说法你会这样做:
DECLARE @strTablename varchar(100) = <YOUR TABLE>
DECLARE @strQuery varchar(max) = ''
DECLARE @strSecondQuery varchar(max) = 'SELECT '
DECLARE @strUnPivot as varchar(max) = ' UNPIVOT ([Count] for [Column] IN ('
SELECT @strQuery = ISNULL(@strQuery,'') + 'datalength([' + name + ']) as [' + name + '] ,'
FROM sys.columns
WHERE object_id = object_id(@strTablename) and is_nullable = 1;
SELECT @strUnPivot = ISNULL(@strUnPivot,'') + '[' + name + '] ,'
from sys.columns
where object_id = object_id(@strTablename) and is_nullable = 1;
SET @strQuery = 'SELECT [Column],[Count] FROM (SELECT ' +
SUBSTRING(@strQuery,1,LEN(@strQuery) - 1) + ' FROM ' + @strTablename + ') AS p ' +
SUBSTRING(@strUnPivot,1,LEN(@strUnPivot) - 1) + ')) AS unpvt '
SET @strQuery =
'SELECT [column], [count] = MAX([count]) FROM (' + @strQuery +
') x GROUP BY [column]'
--PRINT @strQuery;
EXEC (@strQuery);
我解决这个问题的一种方法是使用PRIN T语句来查看我的动态SQL创建的内容。为了更好地理解这里发生了什么,我建议学习更多关于T-SQL UNPIVOT语句以及动态SQL的知识。
你在得到什么,你想得到什么?除了说明之外,还举例说明。 –
我得到重复的列名称与其数据长度 – Batman
如果我在@strQuery中使用count而不是数据长度,那么输出是正确的......但是与数据长度我得到重复的列名称。所以我相信我搞砸了数据长度的使用。 – Batman