我来自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
答案 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);