我已经看到了一些答案,但似乎没有一个答案
我有一个大型数据库,其中许多表基本上彼此相同 - 但是,在过去的某些时候,新列已添加/重命名/删除。
我正在尝试使用INFORMATION_SCHEMA.COLUMNS获取每个目标表的列列表,但是采用数据透视表格式 - 因此表名称位于顶部,顺序位置为行。
使用这些表格
CREATE TABLE tbl1 (
Id int
, Code int
, GroupName varchar(25)
, Amount money
, OutstandingAmount money
, DataDate date
)
ON [PRIMARY]
CREATE TABLE tbl2 (
Id int
, Code int
, CompanyName varchar(25)
, CompanyRegistrationDate date
, Amount money
, OutstandingAmount money
, DataDate date
)
ON [PRIMARY]
CREATE TABLE tbl3 (
Id int
, Code int
, CustomerId varchar(10)
, CustomerName varchar(25)
, Amount money
, OutstandingAmount money
, DataDate date
)
ON [PRIMARY]
然后以下查询获取数据,我可以在Excel中c& p排列列。
select
c.ORDINAL_POSITION
, c.TABLE_NAME
, c.COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS c
WHERE TABLE_NAME LIKE 'tbl%'
ORDINAL_POSITION TABLE_NAME COLUMN_NAME
1 tbl1 Id
2 tbl1 Code
3 tbl1 GroupName
4 tbl1 Amount
5 tbl1 OutstandingAmount
6 tbl1 DataDate
1 tbl2 Id
2 tbl2 Code
3 tbl2 CompanyName
4 tbl2 CompanyRegistrationDate
5 tbl2 Amount
6 tbl2 OutstandingAmount
7 tbl2 DataDate
1 tbl3 Id
2 tbl3 Code
3 tbl3 CustomerId
4 tbl3 CustomerName
5 tbl3 Amount
6 tbl3 OutstandingAmount
7 tbl3 DataDate
然而,实际上有100个表(系统创建),所以c& p并不是一个明智的选择。
我的问题还在于列数不一致。
我尝试了一个支点,但无法解决什么问题!我试图实现这个......
ORDINAL_POSITION tbl1 tbl2 tbl3
1 Id Id Id
2 Code Code Code
3 GroupName CompanyName CustomerId
4 Amount CompanyRegistrationDate CustomerName
5 OutstandingAmount Amount Amount
6 DataDate OustandingAmount OustandingAmount
7 NULL DataDate DataDate
答案 0 :(得分:0)
使用也可以使用目录视图 sys.tables
或sys.columns
代替INFORMATION_SCHEMA.COLUMNS
试试这个: -
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' +
QUOTENAME(t.name)
FROM sys.tables t
inner join sys.columns c
on c.object_id=t.object_id
where t.name like 'tb%'
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
--Select @cols
SELECT @query =
'SELECT *
FROM
(
select t.name as TableName,
c.name ColumnName,
row_number() over (PARTITION BY T.OBJECT_id order by T.NAME) as ID
from sys.tables t
inner join sys.columns c
on c.object_id=t.object_id
where t.name like ''tb%''
) AS t
PIVOT
(
MAX(ColumnName)
FOR TableName IN( ' + @cols + ' )' +
' ) AS p ; ';
execute(@query);