2013-10-15 98 views
1

我想从一列复制行到另一列。执行流程很简单。SQL Server:列添加错误

  1. 检查列是否存在。
  2. 如果没有 - 加列
  3. 定义光标和填充行的新列
  4. 设置列NOT NULL。

不幸的是我得到这种类型的错误。它表示该列不存在。但是我创建了它并且承诺了事务。什么可能是一个原因?谢谢!

消息207,级别16,状态1,行29
无效的列名称FIELD_NAME“。

代码:

begin transaction; 

IF NOT EXISTS(SELECT * FROM sys.columns 
       WHERE Name = N'Field_Name' and Object_ID = Object_ID(N'dbo.Table_Name')) 
BEGIN 
     ALTER TABLE [dbo].[Table_Name] 
     ADD [Field_Name] VARCHAR(255) 
END 
commit; 

DECLARE 
    @var1 int, 
    @var2 varchar(255) 

DECLARE copy_cursor CURSOR FOR 
    SELECT id, Name 
    FROM Table_Name 

OPEN copy_cursor 

FETCH NEXT FROM copy_cursor 
    INTO @var1, @var2 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    UPDATE Table_Name 
    SET Field_Name = @var2 
    WHERE id = @var1 

    FETCH NEXT FROM copy_cursor 
     INTO @var1, @var2 
END 

CLOSE copy_cursor; 
DEALLOCATE copy_cursor; 

ALTER TABLE Table_Name ALTER COLUMN Field_name varchar(255) NOT NULL 
+0

如果表不存在如何添加列? –

+0

如果表格不存在,那么添加一些东西很难:) –

+0

对不起。如果列不存在 –

回答

3

服务器尝试它运行任何它之前编译SQL的整个。因此,在引用查询中的列之前,您需要在单独的批次中创建它(如有必要)。插入GO关键字来指导你的工具(SQLCMD,OSQL,SSMS)发送分批:

begin transaction; 

IF NOT EXISTS(SELECT * FROM sys.columns 
       WHERE Name = N'Field_Name' and Object_ID = Object_ID(N'dbo.Table_Name')) 
BEGIN 
     ALTER TABLE [dbo].[Table_Name] 
     ADD [Field_Name] VARCHAR(255) 
END 
commit; 
GO 

我想你可能还需要包裹ALTER如下处理的情况下列存在:

 EXEC sp_executesql 'ALTER TABLE [dbo].[Table_Name] 
     ADD [Field_Name] VARCHAR(255)' 
0

首先检查,如果表中存在,开始并提交事务,它应该工作。

BEGIN TRANSACTION 

    IF (Object_ID(N'dbo.Table_Name') > 0) 
    BEGIN 
     IF NOT EXISTS(SELECT * FROM sys.columns 
         WHERE Name = N'Field_Name' and Object_ID = Object_ID(N'dbo.Table_Name')) 
     BEGIN 
      ALTER TABLE [dbo].[Table_Name] 
      ADD [Field_Name] VARCHAR(255) 
     END 
    END 

COMMIT 
GO