2017-06-26 51 views
-1

Output of Query我想获取列名称和列数据的长度,并进一步消除其中有0数据长度值的列。我是新的SQL服务器,经过大量的搜索后,我发现查询这将使我要我的问题解决方案如下: -列列数据长度列名

DECLARE @strTablename varchar(100) = 'dbo.test' 
    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 ' 


    EXEC (@strQuery 

) 

但使用此查询后,我收到重复的列名和计数。任何人都可以解释我这个查询,以便我可以按照自己的方式进行更改,特别是我无法理解@strQuery和@ strUnpivot.I使用以下链接中给出的代码来适应我的要求Select non-empty columns using SQL Server。谢谢!

+0

你在得到什么,你想得到什么?除了说明之外,还举例说明。 –

+0

我得到重复的列名称与其数据长度 – Batman

+0

如果我在@strQuery中使用count而不是数据长度,那么输出是正确的......但是与数据长度我得到重复的列名称。所以我相信我搞砸了数据长度的使用。 – Batman

回答

0

现在你的代码是创建和执行该语句:

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的知识。