繁体   English   中英

SQL-如果不存在,则添加列并设置值

[英]SQL - Add column and set value after IF NOT EXISTS

如果某列不存在,我将无法使用Alter Table。

这是我的代码:

DECLARE @appId INT
DECLARE @cursor CURSOR

IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'MinMktIdeaParticipants' AND TABLE_NAME = 'mkIdeaCategories')
BEGIN
    ALTER TABLE mkIdeaCategories
        ADD MinMktIdeaParticipants int NOT NULL DEFAULT 1
END

IF EXISTS(SELECT Value FROM appConfiguration WHERE CodeId = 16 AND AppConfigurationTypeId = 3 AND ModuleId = 10)
BEGIN
    SET @cursor = CURSOR FAST_FORWARD
    FOR
        SELECT ApplicationId FROM mkMarket
        OPEN @cursor
            FETCH NEXT FROM @cursor INTO @appId
                WHILE (@@Fetch_Status >= 0)
                BEGIN
                    UPDATE 
                        mkIdeaCategories
                    SET MinMktIdeaParticipants = (SELECT Value FROM appConfiguration 
                        WHERE ApplicationId = @appId AND CodeId = 16 AND AppConfigurationTypeId = 3 AND ModuleId = 10)
                    WHERE IdeaCatId IN 
                        (select distinct(theme.IdeaCatId) from dbo.mkIdeaCategories theme
                        inner join dbo.mkMarketIdeaCategories mic ON theme.IdeaCatId = mic.IdeaCatId
                        inner join mkMarket m on m.MarketId=mic.MarketId 
                        WHERE m.ApplicationId = @appId)
                    FETCH NEXT FROM @cursor INTO @appId
                END
        CLOSE @cursor
    DEALLOCATE @cursor
    DELETE * FROM appConfiguration WHERE CodeId = 16 AND AppConfigurationTypeId = 3 AND ModuleId = 10
END

我认为没有任何错误。 由于某种原因,输出错误为

消息207,第16级,州1,第53行
无效的列名“ MinMktIdeaParticipants”。

我已经搜索了类似的问题,但是找不到解决问题的答案。

当SQL Server处理脚本时,有两个阶段。 第一阶段是编译。 第二是执行。

您得到的错误是编译错误。 无论if条件, 所有代码都将被编译。 因此,您收到一个错误,因为该列不存在。 在执行阶段之前不会创建该列。

一种解决方案是使用exec (或更好的exec sp_executesql )执行代码,将代码的第二部分更改为动态SQL。

Gordon Linoff的解决方案将起作用。 实现所需目标的另一种方法是将整个语句包装在存储过程中。

这将失败:

select * from nonexisting_table

这将创建一个存储过程:

create procedure nonsense
as
begin
select * from nonexisting_table
end

但是您的查询中有错误:

SET @cursor = CURSOR FAST_FORWARD

要在sql server中创建一个快进游标,您必须对其进行声明。 多数民众赞成在mssqltips.com我最喜欢的示例:

DECLARE db_cursor CURSOR FAST_FORWARD FOR  
SELECT name 
FROM MASTER.dbo.sysdatabases 
WHERE name NOT IN ('master','model','msdb','tempdb')  

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @name   

WHILE @@FETCH_STATUS = 0   
BEGIN   
       SET @fileName = @path + @name + '_' + @fileDate + '.BAK'  
       BACKUP DATABASE @name TO DISK = @fileName  

       FETCH NEXT FROM db_cursor INTO @name   
END   

CLOSE db_cursor   
DEALLOCATE db_cursor

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM