Найти все таблицы с определенным именем столбца +, где значение меньше, чем X - PullRequest
0 голосов
/ 15 октября 2019

Мне нужна помощь в поиске в нашей базе данных. Таким образом, у нас возникла проблема: нам нужно знать все таблицы с именем столбца "sysmodified" и посмотреть, есть ли какие-либо записи до определенной даты (25 сентября 2019 года).

Я попытался найти ответв google и stackoverflow, но я либо получаю ответ, как получить результаты до 25 сентября в 1 таблице Example1 , либо результаты, как получить все таблицы, которые имеют это column_name Example2 .

Используя код, который у меня есть (см. Ниже), мы знаем, что есть 325 таблиц, которые содержат имя столбца "sysmodified". Я мог вручную использовать пример 1 для получения моей информации, но я надеялся получить способ получить нужные мне результаты всего одним запросом.

Это то, что у меня есть:

USE [database2]
GO
SELECT t.name AS table_name, 
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%sysmodified%'
ORDER BY schema_name, table_name;

Однако, если я попытаюсь ввести что-то вроде sysmodified <'20190925'. Я получаю ошибки </p>

WHERE c.name LIKE '%sysmodified%'
AND t.sysmodified < '20190925'

или этот подход, который также приводит к ошибкам

SELECT t.name AS table_name, sysmodified,

на основе (но я не могу добавить 325 имен столбцов в FROM?)

SELECT
  title,
  primary_author,
  published_date
FROM
  books
WHERE
  title LIKE 'The%'

Надеюсь, кто-нибудь сможет мне помочь с решением этой проблемы. Мы используем Microsoft SQL Server Management Studio 17 (если это возможно).

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Комментарий от GMB прав. Самый быстрый способ, которым я могу придумать ответ, - использовать динамический SQL.

Я бы создал запрос для циклического прохождения или создания оператора выбора объединения для всех таблиц, в которых есть этот столбец. Что-то вроде:

(скелет)

DECLARE @N_SQL NVARCHAR(MAX)
Find all tables that have a column with '%sysmodified%'
Build a dynamic query of (union style) from above like:
SET @N_SQL = ''
SELECT @N_SQL = @NSQL + 'UNION SELECT ' [SCHEMA] + '.' + [TABLENAME] + ' AS TABLENAME FROM ' + [SCHEMA] + '.' + [TABLENAME] + ' WHERE ' + [COLUMN] + ' >= '''<DATE>'''

SELECT @N_SQL --just to see what that string looks like
EXEC SP_EXECUTESQL RIGHT(@N_SQL, LEN(@N_SQL) - 5)  --Trimming out the first word "UNION"

Итак, вышеприведенное может работать. Возможно, нужно немного убраться, но это скелетная идея.

1 голос
/ 15 октября 2019

Это довольно простой динамический sql для сборки. Это должно дать результаты, которые вы ищете, поскольку я понимаю ваши требования.

declare @SQL nvarchar(MAX) = ''

select @SQL = @SQL + 'select distinct TableName = ''' + object_name(object_ID) + ''' from ' + quotename(object_name(object_ID)) + ' where ' + quotename(c.name) + ' < ''20190925'' UNION ALL '
from sys.columns c
where name like '%sysmodified%'

set @SQL = left(@SQL, len(@SQL) - 10) --removes the final UNION ALL

select @SQL
--once you are comfortable that the dynamic sql is correct just uncomment the next line
--exec sp_executesql @SQL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...