Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбор из столбца которого может не быть / 6 сообщений из 6, страница 1 из 1
02.11.2020, 15:52
    #40014401
John__Smit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор из столбца которого может не быть
Добрый день, подскажите как выбрать данные из столбца таблицы которого может и не быть. В курсоре перебирается несколько таблиц данные из которых должны быть перезаписаны в одну общую таблицу, но не в каждой перебираемой таблице есть все необходимые столбцы. Cелект выдаёт ошибку, пробовал застраховаться так:

insert into TableNew (col1,col2)
select col1
,case when exists (select 1 from syscolumns where id = object_Id('TableOld') and name = 'col2') then col2 else null end as col2
from TableOld

Не помогает, пробовал динамический запрос:
exec('SELECT (case when not exists (select 1 from syscolumns where id = object_Id('+'''+TableOld+'''+') and name = '+'''+col2+'''+') then col2 else null end) as col2 FROM TableOld')

Не помогает, подскажите как быть.
...
Рейтинг: 0 / 0
02.11.2020, 16:02
    #40014405
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор из столбца которого может не быть
John__Smit,

Проверка наличия столбца идёт на этапе парса, а не выполнения. Переводите в динамику всё.
...
Рейтинг: 0 / 0
02.11.2020, 16:03
    #40014406
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор из столбца которого может не быть
John__Smit,

перебирайте в курсоре только те таблицы, где искомый столбец имеется
...
Рейтинг: 0 / 0
02.11.2020, 16:03
    #40014407
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор из столбца которого может не быть
John__Smit
Добрый день, подскажите как выбрать данные из столбца таблицы которого может и не быть. В курсоре перебирается несколько таблиц данные из которых должны быть перезаписаны в одну общую таблицу, но не в каждой перебираемой таблице есть все необходимые столбцы. Cелект выдаёт ошибку, пробовал застраховаться так:

insert into TableNew (col1,col2)
select col1
,case when exists (select 1 from syscolumns where id = object_Id('TableOld') and name = 'col2') then col2 else null end as col2
from TableOld

Не помогает, пробовал динамический запрос:
exec('SELECT (case when not exists (select 1 from syscolumns where id = object_Id('+'''+TableOld+'''+') and name = '+'''+col2+'''+') then col2 else null end) as col2 FROM TableOld')

Не помогает, подскажите как быть.


Динамически генерировать запрос на основе метаданных.

Например, select с перечислением всех полей из случайной таблицы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
declare @sql varchar(max)

declare @object_id bigint 


select top 1 @object_id = object_id
from sys.tables
order by NEWID()



select @sql = 'select ' + STRING_AGG(c.name, ', ') + ' from ' + OBJECT_SCHEMA_NAME(@object_id) + '.' + OBJECT_NAME(@object_id)
from sys.columns c
where 
	object_id = @object_id




print @sql
...
Рейтинг: 0 / 0
02.11.2020, 16:07
    #40014410
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор из столбца которого может не быть
John__Smit,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
declare @tbl sysname = N'TableOld';
declare @sql nvarchar(max) = N'';
declare @cols nvarchar(max) = N'';

declare @fullColsDef table ([name] sysname);
insert into @fullColsDef values (N'col1'), (N'col2');

select @cols += N',' + IIF(c.[name] IS NULL, N'NULL', c.[name]) + N' AS ' + quotename(f.[name])
from @fullColsDef f
    left join sys.columns c on c.[name] = f.[name] and c.[object_id] = object_id(@tbl);

set @cols = stuff(@cols, 1, 1, '');

set @sql = N'select ' + @cols + N' from ' + quotename(@tbl);
print @sql
exec (@sql)
...
Рейтинг: 0 / 0
02.11.2020, 16:17
    #40014417
John__Smit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор из столбца которого может не быть
Спасибо, буду пробовать
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбор из столбца которого может не быть / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]