【问题标题】:The object name contains more than the maximum number of prefixes. The maximum is 3对象名称包含的前缀数量超过了最大数量。最大值为 3
【发布时间】:2014-11-24 23:50:57
【问题描述】:

我的存储过程正在尝试将记录写入另一台服务器上的数据库。声明在这里:

IF @Builds > 0
   BEGIN
        SET @DPU = @Failures / @Builds
        INSERT INTO SQL05.ManufacturingPortal.dbo.OPC.WriteRequests (ID, RegisterID, Value, RequestedDate, IsCompleted)
        VALUES(@PLCID, 'F8:10' , CAST(@DPU AS NUMERIC(10,2)), GETDATE(), 0)    
    END 

但是,当我尝试创建存储过程时 - 我收到以下错误:

对象名称“SQL05.ManufacturingPortal.dbo.OPC.WriteRequests”包含的前缀数量超过了最大数量。最大值为 3。

我已尝试创建 Server.DB.DBO 的别名以缩短前缀的数量,但似乎实现此错误。

我无法更改目标数据库上的数据库架构。关于如何解决这个问题的任何建议?

谢谢

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    正确的四部分表名是 server.database.schema.tablename - 你有一些多余的部分。

    看起来表名是 OPC.WriteRequests?如果是,那么您必须使用括号:SQL05.ManufacturingPortal.dbo.[OPC.WriteRequests]

    但也许您只是名称的某些部分不正确?

    【讨论】:

    • +1 好猜。我会避免使用这样的表名。他们比做任何好事更让人困惑。如果需要两个单词的表名,请使用 Pascal Casing 或使用 _ 连接单词。
    【解决方案2】:

    就我而言,它实际上希望在 INTO 表所在的服务器上运行:

    SELECT * 
    INTO [database].[schema].[table] 
    FROM [server].[database].[schema].[table]
    

    【讨论】:

    • 将源作为链接服务器,而不是相反,也对我有用。目标是链接服务器的 SELECT INTO 似乎不是一个可行的选择。
    【解决方案3】:

    您收到错误的原因是您没有使用有效的名称。您似乎引用了两个模式,dboOPC

    有效的语法是server_name.database_name.schema_name.object_name,如MSDN article 中引用的INSERT

    删除不正确的架构并重试。

    【讨论】:

    • 嗨,表名是“OPC.WriteRequests”...我知道-我没有写它:-(!
    • 在这种情况下,您只需要使用方括号来限定表名,例如[OPC.WriteRequests]
    【解决方案4】:

    我使用的一切都是正确的,但问题仍然存在。我的命令如下所示

    select * into server.database.schema.table from table2
    

    我通过先在服务器中创建表来解决它,然后使用 insert into 语句执行没有问题

    Create Table...........
    Insert into server.database.schema.table  select * from table2
    

    谢谢, 斯里

    【讨论】:

    • 我也是这么想的。
    【解决方案5】:

    使用与 bratt "[]" 表示名称和远程数据库服务器,就像这样。 [87.247.678.80,1666].[danesfe].[admin1].[homefarsi]

    【讨论】:

      【解决方案6】:

      当我尝试执行以下代码(生成表)时,我遇到了类似的问题

      "into SalesCube_temp.SalesCube_temp.dbo.ALL_SUPPLIER_SALES_METRICS_I"

      然后我意识到我使用了不正确的语法,然后纠正为

      "into SalesCube_temp.dbo.ALL_SUPPLIER_SALES_METRICS_I"

      成功了,我的故事结束了。但是我花了将近 10 到 15 分钟的时间

      希望它对某人有所帮助。

      【讨论】:

      • 在你的例子中没有链接服务器不是吗?
      【解决方案7】:

      我的(继承的)代码使用 string.Format 并传递服务器名称,例如

      string.Format("Select * from {0}.AwesomeDB.dbo.EpicTable", WebConfigurationManager.AppSettings["MuhServerName"]);
      

      但在配置中,“MuhServerName”是“MyServer.MyDomain.com/MyInstance”,所以它被加载为

      Select * from MyServer.MyDomain.com/MyInstance.AwesomeDB.dbo.EpicTable
      

      而不是

      Select * from [MyServer.MyDomain.com/MyInstance].AwesomeDB.dbo.EpicTable
      

      【讨论】:

        【解决方案8】:

        我基本解决了。

        CREATE VIEW view_LINKSERVERTABLE AS   
        SELECT * FROM LINKSERVERNAME.DBNAME.DBO.TABLENAME
        

        然后

          INSERT INTO view_LINKSERVERTABLE SELECT * FROM database
        

        【讨论】:

          【解决方案9】:

          请从一开始就更改表并尝试以正常方式插入

          Use ManufacturingPortal 
          
          IF @Builds > 0
          
             BEGIN
          
                 SET @DPU = @Failures / @Builds
          
                 INSERT INTO OPC.WriteRequests (ID, RegisterID, Value, RequestedDate, IsCompleted)
                 VALUES(@PLCID, 'F8:10' , CAST(@DPU AS NUMERIC(10,2)), GETDATE(), 0)    
          
             END 
          

          【讨论】:

            【解决方案10】:

            我遇到了同样的问题。 问题是由于以下错误造成的:我没有将 textbox1.text 作为参数传递给从代码隐藏调用的查询,而是传递了 textbox1

            希望对你有帮助

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-05-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-11-01
              • 2011-01-25
              相关资源
              最近更新 更多