我正在尝试将行从一列复制到另一列。执行流程很简单。
- 检查列是否存在。
- 如果没有 - 添加列
- 定义游标并填充新列的行
- 将列设置为 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/