Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-如果不存在,则添加列并在后面设置值_Sql_Sql Server 2008 R2_Alter Table - Fatal编程技术网

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

SQL-如果不存在,则添加列并在后面设置值,sql,sql-server-2008-r2,alter-table,Sql,Sql Server 2008 R2,Alter Table,如果列不存在,我就无法使用Alter表 这是我的代码: 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

如果列不存在,我就无法使用Alter表

这是我的代码:

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行
列名“minmktideapartipants”无效


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

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

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


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

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

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


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

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

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


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

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

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


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

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

戈登·林诺夫的解决方案会奏效。实现所需的另一种方法是将整个语句包装在存储过程中

这将失败:

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

戈登·林诺夫的解决方案会奏效。实现所需的另一种方法是将整个语句包装在存储过程中

这将失败:

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

戈登·林诺夫的解决方案会奏效。实现所需的另一种方法是将整个语句包装在存储过程中

这将失败:

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

你可能会觉得这很有帮助你可能会觉得这很有帮助你可能会觉得这很有帮助谢谢你的回复!终于用exec sp_executesql解决了这个问题!谢谢你的回复!终于用exec sp_executesql解决了这个问题!谢谢你的回复!终于用exec sp_executesql解决了这个问题!谢谢你的回复!终于用exec sp_executesql解决了这个问题!谢谢,这就成功了!对于那些可能发现类似问题的人,解决方案是在exec executesql N'…'中声明appId和cursor在alter table语句之后。谢谢,这就成功了!对于那些可能发现类似问题的人,解决方案是在exec executesql N'…'中声明appId和cursor在alter table语句之后。谢谢,这就成功了!对于那些可能发现类似问题的人,解决方案是在exec executesql N'…'中声明appId和cursor在alter table语句之后。谢谢,这就成功了!对于那些可能发现类似问题的人,解决方案是在exec executesql N'…'中声明appId和cursor在ALTERTABLE语句之后。