【问题标题】:MSSQL ERROR "Invalid object name" when I add a field to the query?向查询中添加字段时出现 MSSQL 错误“无效的对象名称”?
【发布时间】:2011-02-23 04:28:56
【问题描述】:

我有一个可以正常工作的 INSERT 查询,但是当我添加一个额外的字段时,我得到了非常有用的信息:

无效的对象名称“优化”

优化是表名。查询如下......我完全不知道为什么这不起作用。如果我将查询剪切并粘贴到 MSSQL Management Studio 中,查询工作正常。

INSERT INTO [optimizations] 
    ([opt_date],[opt_concept_id],[opt_pallet],[opt_turnable],
     [opt_sideupok],[opt_endupok],[opt_flatok],[opt_notstickingout],
     [opt_notinoverhang],[opt_itemsloaded],[opt_loadedweight],
     [opt_pweightutil],[opt_pvolumeutil],[opt_request_xml],
     [opt_response_xml],[opt_images],[opt_primary_stage_id]) 
VALUES 
     (GETDATE(),'775','20ft','true','false','false','true',
      'true','true','10','5952.6','18.6','48.9',
      '<xml><herpa><derpa>xml</derpa></herpa></xml>',
      '<xml><herpa><derpa>xml</derpa></herpa></xml>',
      'img1.jpg,img2.jpg,img3.jpg','98');

由于某种原因,如果我在查询 [opt_primary_stage_id] 中包含最后一个字段,它就不起作用……如果我省略这个字段,它就可以正常工作。有趣的是,如果我将[opt_primary_stage_id] 添加到正在传递的字段列表中,并将其传递给NULL 的值,则查询也可以正常工作。 [opt_primary_stage_id] 字段的数据类型是 INT,我尝试将 VALUES() 部分的最后一个条目作为直号 (3) 和引号 ('3') 包含在内......两者都不起作用。

执行代码的服务器正在运行 PHP 4.3.9,在 IIS 和 MSSQL 下运行。

这是查询的一个版本,使用相同的数据。

INSERT INTO [optimizations] 
    ([opt_date],[opt_concept_id],[opt_pallet],[opt_turnable],
     [opt_sideupok],[opt_endupok],[opt_flatok],[opt_notstickingout],
     [opt_notinoverhang],[opt_itemsloaded],[opt_loadedweight],
     [opt_pweightutil],[opt_pvolumeutil],[opt_request_xml],
     [opt_response_xml],[opt_images])
VALUES 
     (GETDATE(),'775','20ft','true','false','false','true','true',
      'true','10','5952.6','18.6','48.9',
      '<xml><herpa><derpa>xml</derpa></herpa></xml>',
      '<xml><herpa><derpa>xml</derpa></herpa></xml>',
      'img1.jpg,img2.jpg,img3.jpg');

编辑:修复 XML 以具有正确的括号并添加工作查询。

【问题讨论】:

  • 我没有答案,抱歉,但您的两个 XML 示例在“”之后缺少“>”,FWIW。
  • 我们应该知道的任何触发器?
  • 我很困惑这是成功的查询还是失败的查询。 [opt_primary_stage_id] 已经是查询的一部分,所以如果您再次添加它,那可能就是问题所在。
  • @changokun 我刚刚添加了工作版本
  • 使用 SQL Server Profiler(如果您使用的是快速版,则使用免费的替代方法,如 AnjLab SQL Profiler)来捕获正在执行的 实际 查询 - 它可能不同/有在被执行之前被改变了。

标签: php sql-server tsql


【解决方案1】:

添加一个字段不会自行导致失败:一个正当的理由。

你说它在 SSMS 中运行正常,那么它表明问题出在 PHP 或调用中。

第一想法:

  • 命令多长时间。它是否在 PHP 的某个地方被截断?这是动态 SQL IRL 吗?

  • 客户端的用户上下文是否相同?例如,您可能在 2 个不同的架构中拥有相同的表,但具有不同的权限。

  • 连接中有错误的数据库。 SELECT DB_NAME() 说什么?听起来很明显,但没有对象=不存在。不要忽视这个想法并假设它是正确的上下文:检查。

【讨论】:

  • 这个 动态 SQL...但我正在打印 SQL,以便在运行时检查它,然后再执行。复制/粘贴到 SSMS 时,运行时会失败的内容会运行良好。上下文是相同的,只有 1 个数据库和 1 个表可能与之交互......但是有两个不同的用户。如果在我向字段传递 NULL 值时查询不起作用,我会接受这是一个合理的理由。不过感谢您的帮助...我认为这只是我永远无法真正理解的事情之一。
  • 好的,所以一开始我浏览了您提出的解决方案……最后点击的是运行 SELECT DB_NAME() 的建议。答对了! 试图写入一个不同的数据库/连接! 实际问题是,当我为数据库连接执行包含时... 我使用了 include_once 而不是仅仅包含。因为我需要的数据库连接以前被包含过一次......它跳过它并将它留在以前的数据库上下文中。 GBN,你这个男人!
猜你喜欢
  • 2019-07-27
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
相关资源
最近更新 更多