Sql server SQL Server-如果列不存在,则创建列

Sql server SQL Server-如果列不存在,则创建列,sql-server,Sql Server,我有一个tabletemp示例,如: Account ABC DEF GHI ----------------------------------- A001 1000.00 NULL NULL A002 NULL 500.00 800.00 A003 NULL 700.00 NULL A004 1100.00 NULL NULL 收割台ABC、DE

我有一个tabletemp示例,如:

Account    ABC      DEF     GHI     
-----------------------------------
A001       1000.00  NULL    NULL    
A002       NULL     500.00  800.00  
A003       NULL     700.00  NULL    
A004       1100.00  NULL    NULL    
收割台ABC、DEF、GHI是枢轴的结果。我想:

select 
    *,
    case 
       when ABC is not NULL and JKL is not NULL 
          then 1 
          else 0 
    end as newColumn 
from 
    #temp

这会出错,因为JKL不存在。然而,它可以存在,并且在存在时必须加以说明。我如何编辑我的查询语句来检查列ABC和JKL是否存在>如果它们不存在,那么0值>如果它们确实存在并且其中一个为空,那么0值>如果它们都不为空,那么在一个新列中为1值

当您使用一个临时表时,这有点难看,但类似的东西可能会起作用:

IF NOT EXISTS (SELECT 1 
               FROM tempdb.sys.tables t
                    JOIN tempdb.sys.columns c ON t.object_id = c.object_id
               WHERE t.name LIKE N'#temp[_]%'
                 AND c.[name] = N'JKL')
    ALTER TABLE #Temp ADD JKL int;

DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(13);
--Need dynamic SQL, as the batch will fail still otherwise
SET @SQL = N'SELECT *,' + @CRLF + 
           N'CASE WHEN ABC IS NOT NULL AND JKL IS NOT NULL THEN 1 ELSE 0 END AS newColumn' + @CRLF + 
           N'FROM #temp;'

EXEC sp_executesql @SQL;
如果JKL应该有一个非空值,那么对ALTER使用以下命令:


我能够完成以下内容:

IF NOT EXISTS (select 1
    from tempdb.sys.tables t
        inner join tempdb.sys.columns c
        on t.object_id = c.object_id
    where t.Name like '%temp%' AND
        c.Name = 'JKL')
ALTER TABLE #temp ADD JKL int;

select * from #temp 

列是在编译时绑定的,所以我建议您这样做的唯一方法是通过动态SQL。您有一个没有定义定义的表这一事实似乎很奇怪。为什么不确保您拥有JKL列,即使它不是必需的?@Larnu-我认为一个潜在的解决方案是在该列不存在的情况下创建一个新列。但是,我不确定如何实现这一路线。您的数据库设计有缺陷。你绝对不应该有这种问题。这意味着您应该仔细阅读正确的数据库设计并更改数据库布局,而不是试图解决此问题。同意,但该提升不可行。顶部部分我无法运行,但它确实引导我找到以下解决方案。我明白了,我在这里编写了dbo而不是sys,我的错误。固定的现在已经很晚了,行得通。问题:为什么要将表t连接到列c,而不是像这样简单的搜索:从tempdb.sys.columns中选择[name],其中[object_id]=object_idN'tempdb..temp'和[name]像'JKL'比什么都重要,@dcrowley01.您需要的CASE表达式怎么了?@larna-一旦添加了列,我可以在必要时创建一个辅助临时表来包含CASE。我在这里发布了一个更复杂的问题:
IF NOT EXISTS (select 1
    from tempdb.sys.tables t
        inner join tempdb.sys.columns c
        on t.object_id = c.object_id
    where t.Name like '%temp%' AND
        c.Name = 'JKL')
ALTER TABLE #temp ADD JKL int;

select * from #temp