Как найти совпадающие столбцы в нескольких таблицах в базе данных SQL Server? - PullRequest
0 голосов
/ 19 декабря 2018

Как найти подходящие столбцы в нескольких таблицах в базе данных SQL Server?

У меня есть база данных SQL Server с более чем 30 таблицами, есть ли способ фильтрации и / или создания списка общих столбцовсреди таблиц, а не проходить каждую из них вручную?

Может быть, какой-то код?

Ответы [ 6 ]

0 голосов
/ 12 июля 2019

выберите имя как 'Column_Name' из syscolumns s1, где id = object_id ('table1') и
существует (выберите 1 из syscolumns s2, где s2.name = s1.name и s2.id = object_id ('table2')))

вернут соответствующие столбцы

0 голосов
/ 20 декабря 2018

Ниже приведен запрос, который предоставит вам список всех таблиц, в которых присутствует ваш «Столбец».

SELECT c.name AS ColName, t.name AS TableName FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id WHERE c.name LIKE '%ColumnName%';

И на основании этого вы можете продолжить выполнение задачи, которую хотите выполнить.

Недурно, если это полезно.

0 голосов
/ 20 декабря 2018

Я бы использовал что-то простое, как это:

SELECT [Unique name #] = DENSE_RANK() OVER(ORDER BY c.name)
    , [Column] = c.name 
    , [Column type] = t.name
    , [Column max length] = c.max_length
    , [Column precision] = c.precision
    , [Table schema] = OBJECT_SCHEMA_NAME(c.object_id)
    , [Table name] = OBJECT_NAME(c.object_id)
FROM sys.columns as c
INNER JOIN sys.systypes as t ON t.type = c.system_type_id
WHERE OBJECTPROPERTY(c.object_id,'IsTable') = 1
    and  OBJECT_SCHEMA_NAME(c.object_id) != 'sys'
ORDER BY c.name;
0 голосов
/ 19 декабря 2018

это будет работать:

select COLUMN_NAME from ALL_TAB_COLS where TABLE_NAME = 'table1name'
intersect
select COLUMN_NAME from ALL_TAB_COLS where TABLE_NAME = 'table2name';
intersect
...
...
..
...
select COLUMN_NAME from ALL_TAB_COLS where TABLE_NAME = 'table30name';

SQL Server эквивалент:

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'table1'
intersect
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'table2'
intersect
.....
....
...
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'table30';
0 голосов
/ 19 декабря 2018

С этим запросом у вас есть все столбцы с одинаковыми именами в разных таблицах вашей БД:

select object_name(c.id) + '.' + c.name + ' ' 
        + t.name
        + case when t.xtype = t.xusertype then '' else '[' + tr.name end 
        + case 
            when tr.name in ('bit', 'tinyint', 'smallint', 'int', 'bigint', 
                            'float', 'money', 'smallmoney', 'real', 'date', 'time', 
                            'datetime', 'datetime2', 'smalldatetime', 'timestamp')
            then ''
            else 
                case when isNull(c.prec,0)=0 then ''
                else '(' 
                    + case when c.prec = - 1 then 'MAX' else cast(c.prec as varchar) end
                    + case when c.scale is null then '' else ',' + cast(c.scale as varchar) end
                    + ')'
                end
          end
        + case when t.xtype = t.xusertype then '' else ']' end
        + case when t.collationId <> c.collationId
             then ' collate ' + c.collation collate Latin1_General_BIN else '' end
        + case c.isnullable when 0 then ' not null' else '' end
        + case c.colstat
            when 1 then ' identity(' + Cast(Ident_seed(o.name) as varchar)
                      + ',' + cast(Ident_incr(o.name) as varchar) + ')'
            else ''
          end
        + case when cm.text is null then ''
          else ' default '
            + case when patindex('% as %', cm.text) > 0
              then rtrim(substring(cm.text, patindex('% as %', cm.text) + 4, len(cm.text)))
              else substring(cm.text, 2, len(cm.text) - 2)
              end
          end
        as Columns
from syscolumns c
join systypes t on (t.xusertype = c.xusertype)
left join systypes tr
    on (tr.xtype = t.xtype and tr.xusertype = t.xtype)
join sysobjects o
    on (o.id = c.id)
left join syscomments cm
    on (cm.id = c.cdefault)
where c.name in (
        select cl.name
        from syscolumns cl
        join sysobjects ob on (cl.id = ob.id and ob.xtype = 'U')
        group by cl.name
        having count(*) > 1
        )
order by c.name
0 голосов
/ 19 декабря 2018

Как объяснено в комментариях, вы хотите использовать системную таблицу sys.columns для достижения вашей цели.

В этом запросе перечислены все имена столбцов, которые присутствуют в базе данных более одного раза.вместе с числом вхождений:

SELECT name, COUNT(*) 
FROM sys.columns 
GROUP BY name
HAVING COUNT(*) > 1

Вы можете объединить результаты с sys.tables , чтобы восстановить соответствующие таблицы, например:

SELECT
    C.name AS ColumnName,
    T.name AS TableName
FROM
    (SELECT name FROM sys.columns GROUP BY name HAVING COUNT(*) > 1 ) A
    JOIN sys.columns C on C.name = A.name
    JOIN sys.tables T ON T.object_id = C.object_id
ORDER BY
    C.name,
    T.name
...