【问题标题】:Add column if it does not exist如果列不存在则添加
【发布时间】:2019-03-12 21:45:56
【问题描述】:

我运行 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] 列的表格上的日期。

有没有更好的方法来实现这个,Derived Column 函数可能吗?

【问题讨论】:

    标签: sql-server tsql ssis ssms


    【解决方案1】:

    您可以使用动态 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 会向解析器隐藏这样一个事实,即代码中的一个可能路径引用了一个不存在的列。

    【讨论】:

      猜你喜欢
      • 2018-02-02
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      相关资源
      最近更新 更多