Добавить столбец, если он не существует - PullRequest
0 голосов
/ 08 октября 2018

Я использую SSIS для хранилищ данных, в основном он проходит по всем моим базам данных и сохраняет эти данные в таблицу.Однако в некоторых таблицах отсутствует столбец [LastModified], и я хотел бы создать столбец для тех, которые не совпадают.

Это мой оператор выбора -

IF EXISTS(SELECT 1 FROM sys.columns 
      WHERE Name = N'LastModified'
      AND Object_ID = Object_ID(N'dbo.Branch'))
(SELECT [ID]
,ISNULL([Name], '') AS [Name]
,ISNULL([Code], '') AS [Code]
,ISNULL([LastModified], '') AS [LastModified]
,[TimeStampField] from [dbo].[Branch])
ELSE
(SELECT [ID]
,ISNULL([Name], '') AS [Name]
,ISNULL([Code], '') AS [Code]
,getdate() AS [LastModified]
,[TimeStampField] from [dbo].[Branch])

Я получаюошибка - неверное имя столбца «LastModified».

Если я изменю ISNULL([LastModified], '') AS [LastModified] на GetDate() AS [LastModified], это будет работать.Однако это изменит дату в тех таблицах, в которых есть столбец [LastModified].

Есть ли лучший способ реализовать это, возможно, функция «Производный столбец»?

1 Ответ

0 голосов
/ 08 октября 2018

Вы можете сделать это с помощью динамического sql:

DECLARE @sql varchar(max);

IF EXISTS(SELECT 1 FROM sys.columns 
      WHERE Name = N'LastModified'
      AND Object_ID = Object_ID(N'dbo.Branch'))
SET @sql = 'SELECT [ID]
,ISNULL([Name], '') AS [Name]
,ISNULL([Code], '') AS [Code]
,ISNULL([LastModified], '') AS [LastModified]
,[TimeStampField] from [dbo].[Branch]';
ELSE
SET @sql = 'SELECT [ID]
,ISNULL([Name], '') AS [Name]
,ISNULL([Code], '') AS [Code]
,getdate() AS [LastModified]
,[TimeStampField] from [dbo].[Branch]';

EXEC(@sql);

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

...