0

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

Первая таблица: emp

id | name | sal | deptno | loc | referby 
---------------------------------------- 
1 | abc | 100 | 10 | hyd | xyz 
2 | mnc | 200 | 20 | chen | pqr 

Вторая таблица: emprefers

id | name | sal | deptno | loc | referby 

Теперь я хочу данные эх таблиц нагрузки в таблицу emprefers это время я пишу запрос, как

insert into emprefers 
    select * 
    from emp 

После запуск этого запроса, данные загружаются в emp как показано ниже:

id | name | sal | deptno | loc |referby 
---------------------------------------- 
1 | abc | 100 | 10 | hyd | xyz 
2 | mnc | 200 | 20 | chen | pqr 

Теперь я выполнил тот же запрос во второй раз, и он не удался. Причина этого имя столбец удаляется из EMP таблицы

Теперь редактировать запрос как

insert into emprefers 
    select 
     id, 'null' as name, sal, deptno, loc, referby 
    from emp 

После редактирования запроса я запустил его - теперь записи загружаются в emprefers таблицы и данные выглядят как

id | name | sal | deptno | loc | referby 
-------------------------------------------- 
1 | null | 100 | 10 | hyd | xyz 
2 | null | 200 | 20 | chen | pqr 

Каждый раз перед загрузкой emprefers table я усекаю emprefers данные таблицы. И emprefers Структура таблицы никогда не менялась.

Опять же, в третий раз я побежал же запрос снова запрос не удался причиной отсутствующего SAL, Deptno столбцов EMP таблицы

Теперь я не хочу, чтобы изменить запрос снова причина, мы не знаем, какие столбцы будут удалены из emp-таблицы. Это время мы хотим решить проблему, и хотим получить данные о загрузке в

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

Скажите, пожалуйста, как писать запрос для проверки столбца существует или нет, если существует, извлекает тот же самый столбец, другой мудрый присваивает значения null для этого столбца.

+0

Знаете ли вы, какие столбцы могут не существовать и которые, безусловно, существуют? или вы хотите, чтобы запрос тоже нашел это? – mhn

ответ

0

Быстрая работа вокруг - использовать следующий запрос, так как структура таблицы не изменяется. Если он изменится, потребуется больше работы.

DECLARE @sql nvarchar(max) = N'' 

IF EXISTS(SELECT 1 FROM sys.columns c WHERE c.object_id = OBJECT_ID(N'emp') AND c.name = 'id') 
    SET @sql = @sql + ', id' 

IF EXISTS(SELECT 1 FROM sys.columns c WHERE c.object_id = OBJECT_ID(N'emp') AND c.name = 'name') 
    SET @sql = @sql + ', name' 

IF EXISTS(SELECT 1 FROM sys.columns c WHERE c.object_id = OBJECT_ID(N'emp') AND c.name = 'sal') 
    SET @sql = @sql + ', sal' 

IF EXISTS(SELECT 1 FROM sys.columns c WHERE c.object_id = OBJECT_ID(N'emp') AND c.name = 'deptno') 
    SET @sql = @sql + ', deptno' 

IF EXISTS(SELECT 1 FROM sys.columns c WHERE c.object_id = OBJECT_ID(N'emp') AND c.name = 'loc') 
    SET @sql = @sql + ', loc' 

IF EXISTS(SELECT 1 FROM sys.columns c WHERE c.object_id = OBJECT_ID(N'emp') AND c.name = 'referby') 
    SET @sql = @sql + ', referby' 

SET @sql = 'INSERT INTO emprefers (' + STUFF(@sql, 1, 2, '') + ') SELECT * FROM emp' 

PRINT @sql 
EXEC(@sql) 
0

Вы можете использовать Cross Нанести

SELECT x.* 
FROM (SELECT NULL AS id,null as name,null as sal,null as deptno, null as loc,null as referby) AS dummy 
CROSS APPLY 
(
    SELECT 
    id,name,sal,deptno,loc,referby 
    FROM dbo.emprefers 
) AS x; 

Проверили на http://sqlfiddle.com/#!3/f2e558/4

0

Я не верю, что его хорошая идея делать такие вещи, так как имена могут быть изменены ключи могут EXISTS и т.д. , но это должно делать то, что вам нужно:

Create Procedure P_Insert4ExisitingFields(@Source varchar(255),@Dest varchar(255)) as 

DECLARE @SQL VARCHAR(max) 
-- collect all columns existing in both tables 
Select @SQL = @SQL + '['+ a.name+'],' from 
(
Select s.name from sys.syscolumns s 
Join sysobjects m ON m.xtype ='U' and [email protected] and s.id=m.ID 
) a 
JOIN 
(
Select s.name from sys.syscolumns s 
Join sysobjects m ON m.xtype ='U' and [email protected] and s.id=m.ID 
) b on a.name=b.name 
--strip last , 
Select @SQL = SubString(@SQL,1,len(@SQL)-1) 

Select @SQL = 'INSERT into [' + @Dest + '] ('[email protected]+') Select '[email protected]+' from [' + @Source +']' 
--PRINT @SQL 
EXEC (@SQL) 

Пример вызов будет:

P_Insert4ExisitingFields 'emp','emprefers' 

назначая NULL значение не должно быть необходимо, так как это должно быть по умолчанию для полей.