繁体   English   中英

使用游标循环并插入语句

[英]Use cursor to loop and Insert statement

我有一个insert语句,该语句包含一个子查询来确定用作Identity的列中的下一个值,但可悲的是nvarchar(20)类型(顺便说一下,不是我的db)。

我需要能够为AssetNo字段生成下一个增量编号。 我可以通过将其转换为数字来确定下一个数字,但是当插入多个记录时,它们都将获得下一个值。 因此,我认为我需要添加一个游标,但对这些却很少或没有经验。

我的代码如下:

BEGIN
    INSERT INTO tbAsset
    (
        AssetUID,
        AssetNo,
        LocationParentID,
        LocationID,
        LocationDescription,
        Quantity,
        UnitTypeID,
        ElementID,
        LifeExpectancy,
        InstalledDate,
        OutsideHour,
        Status,
        BookingResource,
        IsSystem,
        IsPartOfSystem,
        AssetClassID,
        LastUpdate,
        LastUpdateUser,
        SystemConfidence,
        UserConfidence,
        IsOriginalComponent,
        ClientCode,
        ApplicationResource
    )
           SELECT
               NEWID() AS Expr1,
           (
               SELECT
                   MAX(CASE
                           WHEN ISNUMERIC(AssetNo) = 1
                           THEN CAST(AssetNo AS INT)
                           ELSE NULL
                       END) + 1 AS 'AssetNo'
               FROM tbAsset
           ) AS Expr2,
               Template_Structure_Location.Location_Type,
               Template_Structure_Location.Client_Location_Ref,
               Template_Structure_Location.Location,
               Template_Survey.Quantity,
               tbUnitType.UnitTypeID,
               dbo_Item.CLIENT_ITEM_REF,
               dbo_ProcedureX.LIFE_EXPECTANCY,
               NULL AS Expr3,
               '0' AS Expr4,
               '0' AS Expr5,
               '0' AS Expr6,
               '0' AS Expr7,
               '0' AS Expr8,
               '2' AS Expr9,
               GETDATE() AS Expr10,
               'PDS' AS Expr11,
               '100' AS Expr12,
               '100' AS Expr13,
               '0' AS Expr14,
               '0' AS Expr15,
               '0' AS Expr16
           FROM dbo_Item
           INNER JOIN Template_Survey ON dbo_Item.Itemref = Template_Survey.ItemRef
           INNER JOIN Template_Structure_Location ON Template_Survey.TEMPLATE_STRUCTURE_LOCATION_REF = Template_Structure_Location.TEMPLATE_STRUCTURE_LOCATION_REF
           INNER JOIN Template_Structure ON Template_Structure_Location.TEMPLATE_STRUCTURE_REF = Template_Structure.TEMPLATE_STRUCTURE_REF
           INNER JOIN Template_Details ON Template_Structure.TEMPLATE_DETAILS_REF = Template_Details.TEMPLATE_DETAILS_REF
                                          AND Template_Structure.TEMPLATE_DETAILS_REF = Template_Details.TEMPLATE_DETAILS_REF
           INNER JOIN dbo_ProcedureX ON dbo_Item.Itemref = dbo_ProcedureX.Itemref
           INNER JOIN tbUnitType ON dbo_Item.IPF_Element = tbUnitType.UnitDescription
           LEFT OUTER JOIN tbAsset AS tbAsset_1 ON Template_Survey.K2ref = tbAsset_1.AssetNo
           WHERE(Template_Details.Status = N'Signed Off')
                AND (Template_Details.StatusME = N'Signed Off')
                AND (Template_Survey.K2ref IS NULL)
                AND (dbo_ProcedureX.Replacement = 1);
END;

让我们将其简化为一个基本假设:

insert into t2 (ID, Descrip, AssetNo)
select ID,
       Descrip,
       (
       SELECT MAX(AssetNo) + 1 from T1
       )
from T1

因此,现在让我们尝试解决这个简单的问题(如果您的DBMS支持CTE和窗口函数):

with CTE as
(
select ID, Descrip, row_number() over(order by ID) as RN
from T1
)
insert into t2 (ID, Descrip, AssetNo)
select ID, Descrip, (select max(AssetNo) from T1) + RN
from CTE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM