2016-04-07 11 views
1

ich eine dynamische Abfrage haben, die eine Zeile mit 62 Spalten in SQL holenWie horizontale Reihe in konvertieren vertikale

Die Abfrage ist wie dieser

DECLARE @SQLQuery AS nvarchar(max) 

DECLARE @columns nvarchar(max) 

SELECT 
    @columns = ISNULL(@columns + ', ', '') + QUOTENAME(Column_name) 
FROM (SELECT 
    Column_name 
FROM 
(SELECT 
    Column_name, 
    ROW_NUMBER() OVER (PARTITION BY Column_name ORDER BY Column_name) AS Rows 
FROM information_Schema.Columns 

WHERE Table_Name IN ('Parking', 'AIV_Parking') 
AND column_name NOT IN ('IssueNo', 'Issuedate', 'Agency', 'OfficerName', 'OfficerId', 'Beat', 'UNITSERIAL', 'VEHLICNO', 'VEHLICSTATE', 'VEHLICEXPDATE', 'VEHLICTYPE', 'VEHMAKE', 
'VEHMODEL', 'VEHBODYSTYLE', 'VEHVIN4', 'VEHVIN', 'ISSUENOCHKDGT', 'VEHCOLOR1', 'VEHCOLOR2', 'PERMITNO', 'VEHLABELNO', 'LOCBLOCK', 'LOCSTREET', 'LOCDESCRIPTOR', 'LOCTRAVELDIR', 'LOCSIDEOFSTREET', 
'LOCSUBURB', 'LOCLOT', 'LOCCROSSSTREET1', 'LOCCROSSSTREET2', 'LOCSTATE', 'LOCPOSTALCODE', 'METERNO', 'METERBAYNO', 'REMARK1', 'REMARK2')) p 
WHERE Rows = 2) RequiredColumns 

EXEC ('SELECT ' + @columns + ' FROM AIV_Parking Where Issueno =''100000600''') 

Was mich

unter Aufzeichnungen gibt

So Ergebnis ist etwas wie unten, wo ich nur 1 Reihe auf einmal bekomme.

|ACTLINE1 | ACTLINE2 | AUTOPROC_UNIQUEKEY | COURTADDR| IssueNo|....... 

|SUBIACO | LOCAL LAWS|  NULL   |  NULL | 123 | 

Jetzt möchte ich dies umgesetzt wie:

|FieldName  |         FieldValue 

|ACTLINE1  |          SUBIACO 

|ACTLINE2  |          LOCAL LAWS 

|ISSUENO   |          123 

Während diese Spalte Schwenken ich nur die Spalten wollen, welchen Wert hat ich diese Spalte, deren Wert null oder ‚‘ nicht wollen

Antwort

0

Sie müssen UNION ALL verwenden und das Ergebnis mit einer WHERE Klausel filtern:

DECLARE @SQLQuery AS NVARCHAR(MAX) = '' 

SELECT @SQLQuery = @SQLQuery + 
'SELECT ''' + COLUMN_NAME + ''' AS FieldName, CAST(' + QUOTENAME(COLUMN_NAME) + ' AS NVARCHAR(MAX)) AS FieldValue 
FROM AIV_Parking 
WHERE Issueno =''100000600'' 
UNION ALL' + CHAR(10) 
--QUERY HERE TO GET COLUMNS FROM INFORMATION_SCHEMA.COLUMNS 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME IN('Parking','AIV_Parking') 

IF @SQLQuery <> '' BEGIN 
    -- Remove the last occurence of UNION ALL 
    SELECT @SQLQuery = LEFT(@SQLQuery, LEN(@SQLQuery) - 11) 

    SELECT @SQLQuery = 
    'SELECT * FROM (' + @SQLQuery + ') t WHERE FieldValue IS NOT NULL AND FieldValue <> ''''' 

    EXEC(@SQLQuery) 
END 

Beachten Sie, dass Sie CAST Ihre FieldValue zu einem NVARCHAR(MAX) oder was auch immer Datentyp, der einen Konvertierungsfehler nicht produzieren wird. Dies liegt daran, dass bei Verwendung von UNION alle Spalten den gleichen Datentyp haben müssen, andernfalls werden sie in die mit dem höheren Datentyp Vorrang konvertiert.

+0

Vielen Dank für Ihre Antwort.Aber es funktioniert nicht, wenn ich die Abfrage einfügen, um Spalten zu erhalten, funktioniert es nicht – Khushboo

+0

Lassen Sie mich Ihre Anfrage zu sehen! Sind Sie sicher, dass die von Ihnen eingegebene Abfrage korrekt ist? –

+0

@ Khushboo, was meinst du mit nicht funktioniert? –

Verwandte Themen