SQL Server 2008游标

Bul*_*vak 0 insert cursor sql-server-2008

我需要一些SQL Server游标的帮助:

Declare @DCursor cursor, @OldIndividualID uniqueIdentifier, 
        @NewIndividualID UniqueIdentifier, @NewUniqueColID uniqueIdentifier

Set @DCursor = Cursor For
     Select IndividualID From [MVCOmar2].[dbo].PrideMVCDriver 
     Where UniqueColID='895AE0DE-D2CF-461E-ADA9-14FB8BB59640'
        Set @NewUniqueColID=NEWID()
Open @DCursor
Fetch Next From @DCursor Into @OldIndividualID
While (@@FETCH_STATUS = 0)
Begin
    Set @NewIndividualID=NEWID()
    INSERT INTO [MVCOmar2].[dbo].[PrideMVCCollisionDiagram] ([IndividualID], [ColDiagram],
       [dateEntered]      ,[OfficerID]      ,[UniqueColID]      ,[ESDEditDiagram]) 
    SELECT @NewIndividualID,[ColDiagram]      ,[dateEntered]      ,[OfficerID]      ,
        @NewUniqueColID      ,[ESDEditDiagram] 
        FROM [MVCOmar2].[dbo].[PrideMVCCollisionDiagram] 
       WHERE  [IndividualID]=@OldIndividualID;

    Fetch Next From @DCursor Into @OldIndividualID
End

Close @DCursor
Deallocate @DCursor
Run Code Online (Sandbox Code Playgroud)

我有上面的代码,Select语句工作正常,它返回2行,但由于一些奇怪的原因,光标不工作意味着插入语句没有插入任何没有意义的东西,因为个别的ID应该存在.那个select语句返回2个人ID,所以insert语句应该可以工作但不是这样我不知道该做什么...

Eri*_*ikE 5

我建议您不要使用光标.基于连接的简单插入将执行:

DECLARE @NewCollisionDiagram TABLE (
   IndividualID uniqueidentifier,
   UniqueCOlID uniqueidentifier
);

INSERT MVCOmar2.dbo.PrideMVCCollisionDiagram (
   IndividualID,
   ColDiagram,
   dateEntered,
   OfficerID,
   UniqueColID,
   ESDEditDiagram
)
SELECT
   newid() NewIndividualID, //alias not needed but here for clarity
   CD.ColDiagram,
   CD.dateEntered,
   CD.OfficerID,
   newid() NewUniqueColID,
   CD.ESDEditDiagram
OUTPUT
   inserted.NewIndividualID,
   inserted.NewUniqueColID
INTO
   @NewCollisionDiagram
FROM
   MVCOmar2.dbo.PrideMVCCollisionDiagram CD
   INNER JOIN MVCOmar2.dbo.PrideMVCDriver D
      ON CD.IndividualID = D.IndividualID 
WHERE
   D.UniqueColID = '895AE0DE-D2CF-461E-ADA9-14FB8BB59640';
Run Code Online (Sandbox Code Playgroud)

现在,如果您需要使用new NewIndividualIDNewUniqueColIDvalues,可以从@NewCollisionDiagram表中获取它们.如果你必须使用逐行处理(你正在做类似发送电子邮件或创建表,这绝对需要它),那么你只能在最后一秒,在具有最终数据形式的表上执行它就在它必须逐行处理之前.

为了尝试解决您遇到的问题,我建议您将上面的最后一个INSERT语句调整为一个简单的SELECT,尝试您的过程,并查看输出是否符合您的预期.光标中的隐式JOIN逻辑可能不太正确.

我看到您从正在插入的同一个表中选择的方式可能存在不一致,以及Driver表中的IndividualID是否已存在于CollisionDiagram表中.

  • @Nadal,听我说.我们是SQL专业人员,通过JOINS和基于集合的逻辑解决了您一遍又一遍地使用的问题.仅仅因为个人ID的数量可以变化与任何事情无关.无论有多少,您都可以进行多行处理.我上面的代码一次可以处理100,000行,或者1.请放弃你的信念,即你这样做的方式是唯一的方式,**听我们**.你这样做是错的*. (3认同)