SQL Server : error on column add

标签 sql sql-server

我正在尝试将行从一列复制到另一列。执行流程很简单。

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

不幸的是我遇到了这种类型的错误。它说该列不存在。但我已经创建了它并提交了交易。可能是什么原因?谢谢!

Msg 207, Level 16, State 1, Line 29
Invalid column name '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

最佳答案

服务器在运行任何 SQL 之前会尝试编译整个批处理 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)'

关于SQL Server : error on column add,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19376741/

相关文章:

sql - 如何在一个 MySQL 查询中从两个不同的表中选择记录?

sql - 使用 join 更新多行速度非常慢

sql-server - 为什么我的 Azure SQL 数据库性能会突然下降?

sql - 计数状态变化

mysql - 如何从 schema.rb 文件生成 SQL Server 数据库?

php - 您的 SQL 语法有误;查看与您的 MySQL 服务器版本相对应的手册,了解要使用的正确语法

MySQL 排名查询未给出预期值

mysql - 无法在 FROM 子句中指定更新目标表 'my_table'

sql-server - 如何按原样将数据库从 SQL Server 2005 迁移到 2008?

sql - 从表中获取所有行,其中列仅包含0