#sql-server #ssms #sql-server-2016
#sql-сервер #ssms #sql-server-2016
Вопрос:
Я пытался написать запрос, в котором я мог бы проверить, присутствуют ли определенные имена столбцов во всех таблицах базы данных. чтобы избежать трудностей, я пытался получить доступ ко всем таблицам сразу и проверить, присутствуют ли столбцы в таблицах. Я смог найти приведенный ниже код для получения имени таблицы :
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG='SAMPLE_DB_NAME'
Я не могу попасть внутрь каждой таблицы и проверить имена столбцов.
Если бы кто-нибудь мог помочь мне с запросом, чтобы попасть в каждую таблицу и проверить имена столбцов, которые являются постоянными для всех таблиц.
Комментарии:
1. Итак, если я правильно понял ваш предполагаемый вопрос, вы ищете таблицы, в которых нет столбца
N'{Your Column Name}
?2. Да, но есть несколько столбцов (всего 6), которые я хочу найти в таблице, а в моей базе данных всего 36 таблиц.
3. @RAMAN BHATIA — вы можете попробовать приведенный ниже запрос, предложенный мной. вы можете передать столько столбцов, сколько хотите найти, используя предложение IN.
Ответ №1:
Попробуйте это
SELECT TABLE_CATALOG,
TABLE_NAME,
COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG='SAMPLE_DB_NAME'
AND CHARINDEX('Status',COLUMN_NAME) = 1 -- Specify the column name to check the column is existed
--- in the datbase of all available tables
Ответ №2:
--List of tables
SELECT * FROM sys.tables
--List of Columns
SELECT * FROM sys.columns
--List of Columns Tables joined
SELECT tbl.[name] AS TableName, clm.[name] AS ColumnName FROM sys.tables as tbl INNER JOIN sys.columns as clm ON tbl.[object_id] = clm.[object_id]
-You can check with the column name if the column exist in all tables
USE MyDataBase
DECLARE @TableCount INT
DECLARE @FoundTables INT
SET @TableCount = ( SELECT COUNT(*) FROM sys.tables)
SET @FoundTables = ( SELECT COUNT(DISTINCT(tbl.[name])) AS NumberOfTables FROM sys.tables as tbl INNER JOIN sys.columns as clm ON tbl.[object_id] = clm.[object_id] WHERE clm.[name] = 'YourColumnName')
IF @FoundTables = @TableCount
BEGIN
PRINT 'The column is present in all tables'
END
ELSE
BEGIN
PRINT 'The column is not present in all tables'
END
Ответ №3:
С помощью этого запроса вы можете получить все столбцы, присутствующие во всех таблицах
WITH DistinctColumnNames AS (
SELECT DISTINCT Column_Name
FROM INFORMATION_SCHEMA.COLUMNS C
JOIN INFORMATION_SCHEMA.TABLES T ON C.TABLE_SCHEMA = T.TABLE_SCHEMA AND C.TABLE_NAME = T.TABLE_NAME AND C.TABLE_CATALOG = T.TABLE_CATALOG
WHERE T.TABLE_TYPE = 'BASE TABLE' AND T.TABLE_CATALOG='SAMPLE_DB_NAME' AND T.TABLE_SCHEMA = 'dbo' AND T.TABLE_NAME NOT LIKE 'sys%'
)
SELECT COLUMN_NAME
FROM DistinctColumnNames DC
WHERE NOT EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.TABLES T
WHERE T.TABLE_TYPE = 'BASE TABLE' AND T.TABLE_CATALOG='SAMPLE_DB_NAME' AND T.TABLE_SCHEMA = 'dbo' AND T.TABLE_NAME NOT LIKE 'sys%'
AND NOT EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS C
WHERE C.TABLE_NAME = T.TABLE_NAME AND C.COLUMN_NAME = DC.COLUMN_NAME
AND T.TABLE_CATALOG='SAMPLE_DB_NAME' AND T.TABLE_SCHEMA = 'dbo')
)
Ответ №4:
В приведенном ниже запросе будут перечислены все имена таблиц, в которых отсутствуют какие-либо заданные конкретные поля.
SELECT distinct TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_CATALOG='testdb'
and TABLE_NAME not in(
select object_name(object_id) ObjectName from sys.COLUMNS where name in ('YourfieldName1', 'YourfieldName2')
В приведенном ниже запросе будут перечислены все имена таблиц, в которых будут найдены указанные поля.
select object_name(object_id) ObjectName, *
from sys.COLUMNS where name in ('YourfieldName1', 'YourfieldName2')