SQL Server:无效的列名称


78

我正在修改现有的SQL Server存储过程。我在表中添加了两个新列,并修改了存储过程以选择这两个列。尽管表中的列可用,但SQL Server始终出现此错误:

无效的列名“ INCL_GSTAMOUNT”

在此处输入图片说明

谁能告诉我这是怎么回事?


2
您执行了吗-得到该错误了吗?intellisense可能需要一些时间来更新?

1
您是否重新编译了存储过程?
Lokesh

Answers:


214

每当我遇到这种情况时,我都会按Ctrl+ Shift+R刷新intellisense,然后关闭查询窗口(如有必要,请保存),然后启动一个通常运行良好的新会话。


10
我发现按键足够了(非常感谢!)-无需关闭查询窗口
麻雀

2
谢谢您的帮助,经过数小时的压力,它确实有所帮助。
卡罗琳·艾伦

1
哇!也为我工作!
wakgtech

74

如果将字符串放在双引号而不是单引号中,也可能发生。


1
这就是我的原因-请您解释一下原因
ImranNaqvi 2015年

......谢谢!如此愚蠢。使用双引号中的日期查询日期范围时出现此问题。
conner.xyz 2016年

此解决方案也适用于sybase ASE
Chexpir

使用双引号时,它被解析为列名而不是字符串。如果该列名不可用(字符串通常不作为列存在),则会出现此错误。
吉姆·卢兹

4

封装的SQL语句中也可能发生此错误,例如

宣告@tableName nvarchar(20)SET @tableName ='GROC'

宣告@updtStmt nvarchar(4000)

SET @updtStmt ='更新tbProductMaster_'+ @ tableName +'SET department_str ='+ @tableName exec sp_executesql @updtStmt

只是发现缺少引号来封装参数“ @tableName”,如下所示:

SET @updtStmt ='更新tbProductMaster_'+ @ tableName +'SET department_str ='''+ @tableName +''''

谢谢



2

我刚试过 如果执行该语句以生成本地表,则该工具将接受此列名存在。只需在编辑器窗口中标记表生成语句,然后单击执行即可。


该解决方案是唯一适用于我的解决方案。我尝试刷新Intellisense Local Cache,重新创建存储的Proc,重新连接到SQL Server,直到我只运行代码以创建具有新列名的表,然后更改为插入工作后,任何方法都无法正常工作。
Michael Bruesch '19

1

创建视图时出现相同的错误。

想象一下执行查询而没有问题的选择查询:

select id
from products

尝试从同一查询创建视图将产生错误:

create view app.foobar as
select id
from products

消息207,级别16,状态1,过程foobar,第2行
无效的列名称'id'。

对我来说,这是一个范围界定的问题。请注意,该视图是在其他架构中创建的。指定products表的模式可以解决此问题。即..dbo.products而不是仅仅使用products


1

遵循以下过程可以帮助我解决此问题,但我不知道为什么。

  1. 剪切消息中各行给出的有问题的代码
  2. 保存查询(例如保存到文件)
  3. 将代码粘贴到之前的位置
  4. 再次保存查询

即使执行的查询似乎相同,也不会引发此错误


我有一个类似的问题。我认为编辑器窗口会保存临时数据(临时表)。也许这些步骤对某人有帮助1.重置编辑器窗口2.重置数据(DROP TABLE #TempTable)3.重置SQL Server
SVPopov

1

如果要转到ALTER Table列并立即更新包含同一脚本中的新列的表。请确保GO如下所示在alter table的代码行之后使用命令。

ALTER TABLE Location 
ADD TransitionType SMALLINT NULL
GO   

UPDATE Location SET TransitionType =  4

ALTER TABLE Location 
    ALTER COLUMN TransitionType SMALLINT NOT NULL

那对我有用。为什么会这样?
Nicke Manarin


0

我有一个类似的问题。

问题是表上有一个触发器,该触发器会将更改写入审核日志表。审核日志表中缺少列。


1
您必须详细说明解决问题的解决方案,才能使其成为有效的答案。谢谢。
BogdanC

0
There can be many things:
First attempt, make a select of this field in its source table;
Check the instance of the sql script window, you may be in a different instance;
Check if your join is correct;
Verify query ambiguity, maybe you are making a wrong table reference
Of these checks, run the T-sql script again

[Image of the script SQL][1]
  [1]: https://i.stack.imgur.com/r59ZY.png`enter code here


0

我注意到,在执行联接时,如果要联接MSSQL的表不在要联接的表的旁边,则会抛出“无效的列名”。我尝试指定table1.row1table3.row3,但是仍然出现错误;直到我对查询中的表重新排序后,它才消失。显然,语句中表的顺序很重要。

+-------------+    +-------------+    +-------------+    
| table1      |    | table2      |    | table3      |    
+-------------+    +-------------+    +-------------+    
| row1 | col1 |    | row2 | col2 |    | row3 | col3 |    
+------+------+    +------+------+    +------+------+    
| ...  | ...  |    | ...  | ...  |    | ...  | ...  |    
+------+------+    +------+------+    +------+------+    

SELECT * FROM table1, table2 LEFT JOIN table3 ON row1 = row3; --throws an error
SELECT * FROM table2, table1 LEFT JOIN table3 ON row1 = row3; --works as expected
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.