2017-01-23 1 views
0

De ma table de base de données (client), je dois sélectionner un enregistrement et afficher le résultat en inversant les colonnes en lignes.Colonnes SQL vers les lignes

EG: résultat réel

| ID | Name | Age | 
| 1 | Tom | 25 | 

résultat attendu

| Name | Value| 
| ID | 1 | 
| Name | Tom | 
| Age | 25 | 

Autres détails:

  1. table client a un nombre différent de colums dans différentes bases de données
  2. Je dois le faire dans une fonction (donc je ne peux pas utiliser les requêtes dynamiques, UNPIVOT)

S'il vous plaît me conseiller.

+0

Vous devez coder en dur en quelque sorte tous les noms de colonnes, en utilisant une autre requête dynamique devient obligatoire. –

+0

@ GiorgosBetsos- puisque les colonnes varient, comment puis-je tout coder en dur. Par exemple: une table de base de données peut avoir un identifiant, un nom, un âge, une adresse et une autre peut avoir un identifiant, un nom, un âge. –

+1

http://dba.stackexchange.com/questions/48393/passing-column-names-dynamically-to-unpivot –

Répondre

1

Il utilise CROSS APPLIQUER avec des valeurs pour effectuer UNPIVOT

--Set up test data 
CREATE TABLE dbo.TEST(ID INT IDENTITY (1,1),Name VARCHAR(20),Age TINYINT) 

INSERT INTO dbo.TEST VALUES 
('Shaggy',32) 
,('Fred',28) 
,('Velma',26) 
,('Scooby',7) 



DECLARE @table VARCHAR(255) = 'Test' 
DECLARE @schema VARCHAR(255) = 'dbo' 
DECLARE @ID INT = 2 

--Create a VALUES script for the desired table 
DECLARE @col VARCHAR(1000) 
SELECT 
    @col = COALESCE(@col,'') + '(''' + c.name + ''' ,CAST(A.[' + c.name + '] AS VARCHAR(20))),' 
FROM 
    sys.objects o 
     INNER JOIN sys.columns c 
      ON 
      o.object_id = c.object_id 
WHERE 
    o.name = @table 
    AND 
    SCHEMA_NAME(o.schema_id) = @schema 
ORDER BY 
    c.column_id 

--Remove trailing , 
SET @col = LEFT(@col,LEN(@col)-1) 

--Build Script for unpivoting data. 
DECLARE @str VARCHAR(2000) = ' 
SELECT 
    CAST(C.Col AS VARCHAR(20)) AS [Name] 
    ,CAST(C.Val AS VARCHAR(20)) AS [Value] 
FROM 
    [' + @schema + '].[' + @table + '] A 
     CROSS APPLY (VALUES ' + @col + ') C(Col,Val) 
WHERE 
    A.ID = ''' + CAST(@ID AS VARCHAR(8)) + '''' 

--Run Script 
EXEC (@str) 
+0

Comme j'ai besoin de faire ceci dans une fonction, je ne peux pas utiliser 'EXEC' dedans. –