Выбор из нескольких таблиц (передается другим выбором) - PullRequest
0 голосов
/ 11 февраля 2019

Вопрос обновлен.

Я хочу получить список новых таблиц, которые empty или null в поле description.(новые таблицы означают с префиксом new_) и все таблицы имеют поле описания.

Определение таблицы:

create table topic (id int, description varchar(255));
create table comment (id int, description varchar(255));
create table author (id int, description varchar(255));
create table new_topic (id int, description varchar(255));
create table new_comment (id int, description varchar(255));
create table new_author (id int, description varchar(255));

Пример данных и описание:

insert into new_topic (id, description) values (1, null);
insert into new_topic (id, description) values (2, 'This is topic description');
insert into new_comment (id, description) values (1, null);
insert into new_comment (id, description) values (2, null);
insert into new_author (id, description) values (1, 'This is casual first author.');
insert into new_author (id, description) values (2, 'This is casual second author.');

Как вы можетеобратите внимание на мой пример, идеальный вывод для моих образцов данных был бы:

table_name:
new_topic
new_comment

Мое реальное решение работает, но мне нужно вручную добавить таблицы, и я делаю много повторений.

select  distinct 'new_topic' as table_name
from new_topic where description is null
select distinct 'new_comment' as table_name
from new_comment where description is null
select  distinct 'new_author' as table_name
from new_author where description is null

И вывод моего решения выглядит следующим образом:

table_name
new_topic
table_name
new_comment
table_name

Я также создал SELECT, чтобы получить все новые таблицы:

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'new_%' AND TABLE_TYPE = 'BASE TABLE'

Который мог бы стать точкой входа для моегопредыдущий выбор, но я не знаю, как соединить эти два.

Также мое решение доступно на dbfiddle

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

О, я думаю, я понимаю, что вы после.Да, это требует динамического SQL.Также обратите внимание, что ваш запрос на поиск всех таблиц с именем, подобным new_, не совсем верен.Подчеркивание - это проверка шаблона.Так что это вернет таблицу с именем "новости", когда вы этого не хотите.Оберните подчеркивание в квадратные скобки, чтобы решить эту проблему.Вот как бы я поступил с этим типом запроса.Комментарии в коде должны объяснить это.

declare @SQL nvarchar(max) = '' --this must be initialized to an empty string for this to work.

select @SQL = @SQL + 'select distinct TableName = ''' + t.name + ''' from ' + quotename(t.name) + ' where description is null union all '
from sys.tables t
where name like 'new[_]%' --need the square brackets because the underscore is a wildcard so you might get false positives


select @SQL = left(@SQL, len(@SQL) - 10)

--this will show you the dynamic sql
select @SQL

--once you are satisfied the dynamic sql is correct uncomment the next line to execute it
--exec sp_executesql @SQL
0 голосов
/ 11 февраля 2019

Не могли бы вы просто: -

select table_name from information_schema.columns 
where table_name like 'prefix_%' and (column_name is null or column_name='')
...