2017-06-26 4 views
-1

Output of Query Ich versuche, Spaltennamen und Spaltendatenlänge für Spalten zu erhalten und weiter die Spalten mit 0 Datenlängenwerten zu entfernen.Ich bin neu im SQL Server und nach vielen Suchen fand ich ich erhalte doppelte Spaltennamen und zähleAbrufen der Spaltendatenlänge gegen Spaltennamen

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 

) 

aber nach dieser Abfrage -: eine Abfrage, die mir Lösung für mein Problem geben würde, die wie folgt ist. Kann jemand mir diese Abfrage erklären, damit ich es so ändern kann, wie ich will, besonders kann ich @strQuery und @ strUnpivot nicht verstehen. Ich verwendete den Code, der in dem folgenden Link gegeben wurde, um meinen Anforderungen Select non-empty columns using SQL Server zu entsprechen. Vielen Dank!

+0

Was bekommen Sie und was versuchen Sie stattdessen zu bekommen? Geben Sie neben den Beschreibungen Beispiele an. –

+0

Ich erhalte doppelten Spaltennamen gegen seine Datenlängen – Batman

+0

Wenn ich in @strQuery anstelle der Datenlänge zählen, ist die Ausgabe korrekt ... aber mit Datenlänge bekomme ich repetitive Spaltennamen.so bin ich sicher, dass ich mit der Verwendung der Datenlänge. – Batman

Antwort

0

Gerade jetzt Ihr Code erstellen und diese Anweisung ausführen:

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 

Was ich denke, die Sie suchen, ist eine dynamische SQL-Anweisung, die das schafft: dynamisch diese Aussage erstellen Um

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] 

Sie würden dies tun:

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); 

Eine Möglichkeit, die ich dies zu beheben ist, ist mit einem PRIN T-Anweisung, um zu sehen, was mein Dynamic SQL erstellt. Um besser zu verstehen, was hier vor sich geht, würde ich vorschlagen, mehr über die T-SQL UNPIVOT-Anweisung sowie Dynamic SQL zu lernen.

Verwandte Themen