比较表的列名和视图的列名

问题描述 投票:-2回答:1

目的是将表column_name与视图column_name进行比较,以检查它们是否具有相同的列,但是,使它们具有不同的顺序。希望看到它们的顺序相同

select t1.COLUMN_NAME, t2.COLUMN_NAME from 

(select * from information_schema.columns where TABLE_SCHEMA = 'dmt' and  table_name = '@tablename' ) as t1
left join
(select * from information_schema.columns where TABLE_SCHEMA  =  'models' and table_name = 'viewName') as t2
on t1.ORDINAL_POSITION = t2.ORDINAL_POSITION

我想以相同的顺序获得输出,例如:

Column_Name 1 Column_Name 2 

    cat            cat  
    dog            dog
sql sql-server
1个回答
1
投票

您可以使用以下内容来比较各列。

WITH ColumnsCTE (TABLE_NAME, COLUMN_NAME) AS
(
  SELECT TABLE_NAME, COLUMN_NAME 
  FROM INFORMATION_SCHEMA.COLUMNS 
  WHERE TABLE_SCHEMA = 'dmt' AND TABLE_NAME = 'TableName'
  UNION ALL
  SELECT TABLE_NAME, COLUMN_NAME 
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_SCHEMA = 'models' AND TABLE_NAME = 'ViewName'
)

-- get the different columns of the tables / views.
SELECT t1.TABLE_NAME, t1.COLUMN_NAME AS [COLUMN_NAME 1], ISNULL(t2.COLUMN_NAME, 'missing on other table / view') AS [COLUMN_NAME 2]
FROM ColumnsCTE AS t1 LEFT JOIN ColumnsCTE AS t2 ON t1.COLUMN_NAME = t2.COLUMN_NAME AND t1.TABLE_NAME <> t2.TABLE_NAME
WHERE t2.COLUMN_NAME IS NULL

demo on dbfiddle.uk

由于列的顺序可能不同,因此无法使用ORDINAL_POSITION获得预期的结果。请参见以下示例,其中ORDINAL_POSITION不同,但两个表/视图中的列均可用:

CREATE TABLE Test (
  id INT,
  name VARCHAR(100)
);

CREATE VIEW ViewTest AS
  SELECT name, id FROM Test;
© www.soinside.com 2019 - 2024. All rights reserved.