我对SQL很新。我正在使用SQL Server 2012.我需要执行以下操作:向现有表添加列,并使用相同的值填充该列中的所有行。为此,我基于在线搜索得出以下内容:
ALTER TABLE myTable ADD myNewColumn VARCHAR(50) NULL
UPDATE myTable SET myNewColumn = 'test'
问题是在SQL Server中,第二个语句出现以下错误:
列名称无效' myNewColumn
所以,我的猜测是第一个语句没有创建一个名为myNewColumn
的新列。
答案 0 :(得分:7)
您需要在单独的批处理中执行更新。否则,SQL Server会尝试解析并验证该列是否存在,然后再尝试运行创建它的ALTER
。您在分析时获得无效的列名,而不是在运行时。
一种解决方法是在两个批次之间使用GO
:
ALTER TABLE dbo.myTable ADD myNewColumn VARCHAR(50) NULL;
GO
UPDATE dbo.myTable SET myNewColumn = 'test';
(Always use schema prefixes to reference objects和always terminate statements with semi-colons。)
但是这仅适用于Management Studio和其他某些客户端应用程序,因为它实际上不是T-SQL语言的一部分;这些客户端工具将其视为批处理分隔符,并告诉他们分别提交和评估这两个批处理。它不能用于以其他方式提交给SQL Server的代码块以及作为单个批处理的代码块,例如在存储过程的主体中:
CREATE PROCEDURE dbo.foo
AS
BEGIN
SET NOCOUNT ON;
SELECT 1;
GO
SELECT 2;
END
GO
这会产生以下错误,因为它实际上将存储过程拆分为两个单独的批处理:
Msg 102,Level 15,State 1,Procedure foo,Line 8
';'附近的语法不正确。
消息102,第15级,状态1,第11行
'END'附近的语法不正确。
作为一种不同的解决方法,您可以通过在动态SQL中执行更新来强制更新到自己的批处理中。
DECLARE @sql NVARCHAR(MAX), @value VARCHAR(50) = 'test';
ALTER TABLE dbo.myTable ADD myNewColumn VARCHAR(50) NULL;
SET @sql = N'UPDATE dbo.myTable SET myNewColumn = @value;';
EXEC sp_executesql @sql, N'@value VARCHAR(50)', @value;
(Why you should use EXEC sp_executesql
vs. EXEC(@sql);
。)
另一种解决方法;只需一步即可执行添加和更新:
ALTER TABLE dbo.myTable ADD myNewColumn VARCHAR(50) DEFAULT 'test' WITH VALUES;
(如果您实际上不希望将来的任何行在可能导致该行为的情况下继承该值,则可以稍后删除默认约束。)
答案 1 :(得分:4)
在alter statement
之后放置GO
一词
答案 2 :(得分:0)
尝试类似:
ALTER TABLE myTable ADD myNewColumn VARCHAR(50) NULL DEFAULT("Something")
您的代码存在的问题是,在查询完成之后,该列才会存在。所以你可以在那之前引用它。
答案 3 :(得分:0)
Alter
和update
无法同时执行。您需要使用内置存储过程将其隔离,以执行更新语句,如下所示:
ALTER TABLE myTable ADD myNewColumn VARCHAR(50) NULL
Exec sp_executesql N'UPDATE myTable SET myNewColumn = ''test'''
这绝对可以解决这个问题。