SQL Server插入"多部分标识符无法绑定"

时间:2016-11-11 10:07:20

标签: sql sql-server tsql

我来自Oracle,并且SQL Server Management Studio存在一些问题。

我们有一个视图,但它的速度很慢,需要大约50秒。所以我想创建一个静态表,并通过触发器或每日批处理作业将视图的结果插入到该表中。

视图如下所示:

CREATE VIEW [dbo].[Hierachical_View_with_Jobnumbers]
AS
    WITH ProductList AS
    (
        SELECT  
            p.Serialnumber, p.Type_Id,
            p.Date, p.Parent_Serialnumber, 
            p.ActiveJob_Jobnumber as JobNumber,
            N'/' + CONVERT(NVARCHAR(4000), ROW_NUMBER() OVER (ORDER BY p.Serialnumber)) + N'/' AS ProductNode_AsChar
        FROM 
            Products AS p
        WHERE 
            p.Parent_Serialnumber IS NULL

        UNION ALL

        SELECT  
            p.Serialnumber, p.Type_Id,
            p.Date, p.Parent_Serialnumber, 
            JobNumber,
            pl.ProductNode_AsChar + CONVERT(NVARCHAR(4000), ROW_NUMBER() OVER (ORDER BY p.Serialnumber)) + N'/'
        FROM 
            Products AS p
        INNER JOIN 
            ProductList AS pl ON p.Parent_Serialnumber = pl.Serialnumber
    ) 
    SELECT  
        Serialnumber, pt.Name as TypeName,
        Date, Parent_Serialnumber,
        JobNumber,
        CONVERT(HIERARCHYID, ProductNode_AsChar) AS ProductNode
    FROM 
        ProductList AS pl
    INNER JOIN 
        ProductTypes AS pt ON pl.Type_Id = pt.Id;

我已创建了一个表格dbo.ser_number_all,并添加了一个uniqueidentifier列,以便拥有一个主键,我们在上面的视图中没有这个主键。

在Oracle中我会像现在这样插入:

insert into [dbo].[ser_number_all]
  ( ID
  , Serialnumber
  , TypeName
  , Date
  , Parent_Serialnumber
  , JobNumber
  , ProductNode)
  select init_id_seq.nextval
          , Serialnumber
          , TypeName
          , Date
          , Parent_Serialnumber
          , JobNumber
          , ProductNode
  from dbo.Hierachical_View_with_Jobnumbers
where not exists (select 1
                  from Hierachical_View_with_Jobnumbers as hv
                  where hv. Serialnumber = ser_number_all.Serialnumber
                  and hv. TypeName = ser_number_all.TypeName
                  and hv. Date = ser_number_all.Date
                  and hv. Parent_Serialnumber = ser_number_all.Parent_Serialnumber
                  and hv. JobNumber = ser_number_all.JobNumber
                  and hv. ProductNode = ser_number_all.ProductNode);

但是SQL Server总是返回错误

  

无法绑定多部分标识符init_id_seq.nextval

并且

中的所有列都相同
select 1 statement. "ser_number_all.Serialnumber", "ser_number_all.TypeName", "ser_number_all.Date", "ser_number_all.Parent_Serialnumber", "ser_number_all.JobNumber" and "ser_number_all.ProductNode"`.

我在这里做错了什么?

日Thnx

5 个答案:

答案 0 :(得分:1)

试试这个

insert into [dbo].[ser_number_all]
  ( ID
  , Serialnumber
  , TypeName
  , Date
  , Parent_Serialnumber
  , JobNumber
  , ProductNode)
  select init_id_seq.nextval
      , Serialnumber
      , TypeName
      , Date
      , Parent_Serialnumber
      , JobNumber
      , ProductNode
  from dbo.Hierachical_View_with_Jobnumbers as ser_number_all
where not exists (select 1
                  from Hierachical_View_with_Jobnumbers as hv
              where hv. Serialnumber = ser_number_all.Serialnumber
              and hv. TypeName = ser_number_all.TypeName
              and hv. Date = ser_number_all.Date
              and hv. Parent_Serialnumber = ser_number_all.Parent_Serialnumber
              and hv. JobNumber = ser_number_all.JobNumber
              and hv. ProductNode = ser_number_all.ProductNode);

OR

    insert into [dbo].[ser_number_all]
  ( ID
  , Serialnumber
  , TypeName
  , Date
  , Parent_Serialnumber
  , JobNumber
  , ProductNode)
  select init_id_seq.nextval
      , Serialnumber
      , TypeName
      , Date
      , Parent_Serialnumber
      , JobNumber
      , ProductNode
  from dbo.Hierachical_View_with_Jobnumbers 
where not exists (select 1
                  from Hierachical_View_with_Jobnumbers as hv
              where hv. Serialnumber = Serialnumber
              and hv. TypeName = TypeName
              and hv. Date = Date
              and hv. Parent_Serialnumber = Parent_Serialnumber
              and hv. JobNumber = JobNumber
              and hv. ProductNode = ProductNode);

答案 1 :(得分:0)

更像下面的内容 - 别名Hierachical_View_with_Jobnumbers到hv并检查[ser_number_all]

中是否缺少值
    insert into [dbo].[ser_number_all]
  ( ID
   , Serialnumber
   , TypeName
   , Date
   , Parent_Serialnumber
  , JobNumber
  , ProductNode)
  select hv.nextval
          , hv.Serialnumber
          , hv.TypeName
          , hv.[Date]
          , hv.Parent_Serialnumber
          , hv.JobNumber
          , hv.ProductNode
    from dbo.Hierachical_View_with_Jobnumbers hv
  where not exists (select 1
                                  from[ser_number_all]  ser_number_all
                                 where hv. Serialnumber = ser_number_all.Serialnumber
                                     and hv. TypeName = ser_number_all.TypeName
                                     and hv. Date = ser_number_all.Date
                                     and hv. Parent_Serialnumber = ser_number_all.Parent_Serialnumber
                                     and hv. JobNumber = ser_number_all.JobNumber
                                     and hv. ProductNode = ser_number_all.ProductNode);

答案 2 :(得分:0)

试试这个

insert into [dbo].[ser_number_all]
  ( ID
  , Serialnumber
  , TypeName
  , Date
  , Parent_Serialnumber
  , JobNumber
  , ProductNode)
  select init_id_seq.nextval
      , Serialnumber
      , TypeName
      , Date
      , Parent_Serialnumber
      , JobNumber
      , ProductNode
  from dbo.Hierachical_View_with_Jobnumbers as ser_number_all
where not exists (select 1
                  from Hierachical_View_with_Jobnumbers as hv
              where hv. Serialnumber = ser_number_all.Serialnumber
              and hv. TypeName = ser_number_all.TypeName
              and hv. Date = ser_number_all.Date
              and hv. Parent_Serialnumber = ser_number_all.Parent_Serialnumber
              and hv. JobNumber = ser_number_all.JobNumber
              and hv. ProductNode = ser_number_all.ProductNode);

答案 3 :(得分:0)

我不太了解Oracle如何处理其数据库,但查看init_id_seq.nextval它看起来像一个方法调用,它将返回下一个可用的唯一标识。

如果是这种情况,则需要在SQL Server中以不同方式处理它。设置标识列时,在表设计器中将标识列标记为isIdentity。从insert语句中删除此列。 SQL将自动使用下一个种子值填充它。

或者,如果该字段是唯一标识符,并且您希望将其包含在insert语句中,则可以将init_id_seq.nextval替换为NEWID()

答案 4 :(得分:0)

对SQL Server中的序列没有与Oracle中相同的控制权。要将Guids插入表格,您需要使用NEWID()函数来完成与init_id_seq.nextval相同的结果。

insert into [dbo].[ser_number_all]
  ( ID
  , Serialnumber
  , TypeName
  , Date
  , Parent_Serialnumber
  , JobNumber
  , ProductNode)
  select NEWID()
          , Serialnumber
          , TypeName
          , Date
          , Parent_Serialnumber
          , JobNumber
          , ProductNode
  from dbo.Hierachical_View_with_Jobnumbers
where not exists (select 1
                  from Hierachical_View_with_Jobnumbers as hv
                  where hv. Serialnumber = ser_number_all.Serialnumber
                  and hv. TypeName = ser_number_all.TypeName
                  and hv. Date = ser_number_all.Date
                  and hv. Parent_Serialnumber = ser_number_all.Parent_Serialnumber
                  and hv. JobNumber = ser_number_all.JobNumber
                  and hv. ProductNode = ser_number_all.ProductNode);