1

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

  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
4

2 回答 2

3

服务器会在运行任何 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)'
于 2013-10-15T08:57:58.797 回答
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
于 2013-10-15T08:52:12.253 回答