【问题标题】:SQL Server : error on column addSQL Server:添加列时出错
【发布时间】:2014-10-13 22:53:46
【问题描述】:

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

  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

【问题讨论】:

  • 如果表不存在如何添加列?
  • 如果表不存在,添加一些东西有点困难:)
  • 对不起。如果列不存在
  • 至于 SQL 对我来说没有任何问题,除了我不在我的 SQL 中使用分号,我会使用 FAST FORWARD 为我的游标声明并在提交后有一个 GO我的交易:) SQL Server utilities interpret GO as a signal that they should send the current batch of Transact-SQL statements to an instance of SQL Server. link
  • 重新创建了我的问题。提交后使用 GO 应该可以解决这个问题。

标签: sql sql-server


【解决方案1】:

服务器在运行任何 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)'

【讨论】:

    【解决方案2】:

    首先检查表是否存在,启动并提交事务,它应该可以工作。

    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
    

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多