2016-04-30 70 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