添加列(如果不存在)

时间:2018-10-08 08:49:49

标签: sql-server tsql ssis ssms

我运行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 :(得分:3)

您可以使用动态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);

使用Dynamic SQL从解析器中隐藏了以下事实:代码中可能的路径之一引用了不存在的列。