2016-04-30 142 views
4

Clients如何通過對象ID和列ID查詢表數據?

PK LastName Name  Address 
1 Vidal  Arturo  St.... 
2 Lavezzi  Ezequiel St.... 
3 Cuadrado Guillermo St.... 

我想:

Desired Table

用下面的查詢給我的第一個四列,但我怎麼能與表中的數據聯繫起來呢?

SELECT TAB.object_id OBEJCTID, TAB.name TABLENAME, COL.column_id COLUMNID, COL.name FROM sys.tables TAB 
JOIN SYS.columns COL 
ON TAB.object_id = COL.object_id 
WHERE TAB.object_id = 25659888; 
+0

請你解釋一下多一點的輸出? – TheGameiswar

回答

3

您需要unpivot的數據。

嘗試是這樣的

;WITH cte 
    AS (SELECT column_name, 
       table_value 
     FROM clients 
       CROSS apply (VALUES ('pk',CONVERT(varchar(20),PK)), 
            ('LastName',lastname), 
            ('Name', NAME), 
            ('Address',address)) cs(column_name, table_value)), 
    yourquery 
    AS (SELECT TAB.object_id OBEJCTID, 
       TAB.NAME  TABLENAME, 
       COL.column_id COLUMNID, 
       COL.NAME 
     FROM sys.tables TAB 
       JOIN sys.columns COL 
        ON TAB.object_id = COL.object_id 
     WHERE TAB.object_id = 25659888) 
SELECT * 
FROM cte c 
     JOIN yourquery y 
     ON y.NAME = c.column_name 
0

另一種方法,在這裏你必須對所有列轉換成一個類型,例如我int轉換爲VARCHAR(50),在我的表中的所有其他列都是VARCHAR(50 )eather:

SELECT TAB.name TableName, 
     TAB.object_id ObjectId, 
     COL.name ColumnName, 
     COL.column_id ColumnId, 
     U.ColumnValue TableValue, 
     T.name TableType 
FROM sys.tables TAB 
INNER JOIN SYS.columns COL 
    ON TAB.object_id = COL.object_id 
INNER JOIN sys.types T 
    ON T.user_type_id = COL.system_type_id 
INNER JOIN (
     SELECT ColumnName, ColumnValue 
     FROM (SELECT CONVERT(varchar(50),PK) as PK , LastName, Name, [Address] 
      --here to convert all in one type 
     FROM Clients) 
     AS P 
     UNPIVOT 
     (
      ColumnValue FOR ColumnName IN (PK, LastName, Name, [Address]) 
     ) as unpvt 
    ) as U 
    ON U.ColumnName = COL.name 
WHERE TAB.object_id = 25659888; 

輸出:

TableName ObjectId ColumnName ColumnId TableValue TableType 
Clients  25659888 PK   1   1   int 
Clients  25659888 LastName 2   Vidal  varchar 
Clients  25659888 Name  3   Arturo  varchar 
Clients  25659888 Address  4   St....  varchar 
Clients  25659888 PK   1   2   int 
Clients  25659888 LastName 2   Lavezzi  varchar 
Clients  25659888 Name  3   Ezequiel varchar 
Clients  25659888 Address  4   St....  varchar 
Clients  25659888 PK   1   3   int 
Clients  25659888 LastName 2   Cuadrado varchar 
Clients  25659888 Name  3   Guillermo varchar 
Clients  25659888 Address  4   St....  varchar