2017-09-07 19 views
0

IDとして使用される列の次の値を決定するためのサブクエリを含むinsert文がありますが、悲しいことにnvarchar(20)型です。方法)。カーソルを使用してループと挿入文を使用する

私は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; 
+3

今日のヒント:テーブルエイリアス! – jarlh

+1

このような大きな質問を投稿する前にhttps://stackoverflow.com/help/mcveを読んでください。 – jarlh

+0

これはSQL Server 2012です - 見落としに対するお詫び –

答えて

0

はのが基本的な前提にこれをダウントリムしてみましょう:あなたのDBMSは、CTEをサポートしている場合

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

だから今、(のは、この単純な問題を試してみて、解決しましょうとウィンドウ関数):

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 
+0

@Rahulは私が思っ 'NEWIDを()' MS SQLだっただけ – JohnHC

+0

あなたは私がどこ...右 – Rahul

+0

@a_horse_with_no_name、誰ではないが、それは、MySQLについてではありません...あなたはごめんなさい – Rahul

関連する問題