使用SQL插入重复记录

时间:2012-06-06 22:01:53

标签: sql sql-server stored-procedures

我通过搜索UniqueColID并将结果重新插入表中来复制记录....这样做我有一个重复的条目,这是我想要的除外我希望一列不重复,该列是UniqueColID。

以下是我的代码:

CREATE PROCEDURE [dbo].[InsertDuplicateFields] 
    (@UniqueColID varchar(50), @IndividualID varchar(50) = null)
AS
Begin           
    INSERT INTO TableCollisionBegin 
        SELECT * FROM TableCollisionBegin 
        WHERE [UniqueColID] = @UniqueColID;

    INSERT INTO TableCollisionDetails 
        SELECT * FROM TableCollisionDetails 
        WHERE [UniqueColID] = @UniqueColID;

    INSERT INTO TableCollisionLocation 
        SELECT * FROM TableCollisionLocation 
        WHERE [UniqueColID] = @UniqueColID;

    INSERT INTO TableDriver 
        SELECT * FROM TableDriver 
        WHERE [UniqueColID] = @UniqueColID;

    INSERT INTO TableFollowUp 
        SELECT * FROM TableFollowUp 
        WHERE [UniqueColID] = @UniqueColID;

    INSERT INTO TableOfficerLogs 
        SELECT * FROM TableOfficerLogs 
        WHERE [UniqueColID] = @UniqueColID;

    INSERT INTO TablePolice 
        SELECT * FROM TablePolice 
        WHERE [UniqueColID] = @UniqueColID;

    INSERT INTO TableRecVerified 
        SELECT * FROM TableRecVerified 
        WHERE [UniqueColID] = @UniqueColID;

    INSERT INTO TableSignature 
        SELECT * FROM TableSignature 
        WHERE [IndividualID] = @IndividualID;

    INSERT INTO TableTrailer 
        SELECT * FROM TableTrailer 
        WHERE [UniqueColID] = @UniqueColID;

    INSERT INTO TableValidateLog 
        SELECT * FROM TableValidateLog 
        WHERE [UniqueColID] = @UniqueColID;

    INSERT INTO TableVehicle 
        SELECT * FROM TableVehicle 
        WHERE [UniqueColID] = @UniqueColID;

    INSERT INTO TableWitness 
        SELECT * FROM TableWitness 
        WHERE [UniqueColID] = @UniqueColID;


End

每个表都有NUMEROUS列,但它们都共享UniqueColID。

当我插入副本时,我希望所有细节都重复,但我想插入一个新的UniqueColID ..我可以这样做吗?

新的UniqueColID由ASP.NET代码中的特殊方法生成。我希望有2或3或4个不同的UniqueColID,其余列是重复的。

我尝试了你说的第二段代码但得到了错误:

"Unknown object type 'TEMPORARY' used in a CREATE, DROP, or ALTER statement."





CREATE PROCEDURE [dbo].[AmendInsertDuplicateFields] (@UniqueColID varchar(50), @NewUniqueColID varchar(50)) 

AS 
Begin CREATE TEMPORARY TABLE Temp AS SELECT * FROM [MVCNew].[dbo].[CollisionBegin] WHERE [UniqueColID] = @UniqueColID; 

UPDATE Temp SET UniqueColID = @NewUniqueColID; 
INSERT INTO [MVCNew].[dbo].[CollisionBegin] SELECT * FROM Temp; 
DROP TEMPORARY TABLE IF EXISTS Temp; 
End

我只是想...我是否有可能插入一条带有SOME Random UniqueColID值的新记录,但所有其他列都插入了值“o”或“u”或“一些随机文本”然后我在UniqueColID之外的所有UniqueColID列中插入此新记录?这样我就会有一个新的UniqueColID,其余的列具有相同的值。

KCD我已经尝试了两个代码块而没有工作.. :(

我个人不知道SELECT @NewUniqueColID ....甚至是如何工作的,因为表中没有名为@NewUniqueColID

的值的列

2 个答案:

答案 0 :(得分:4)

但是看起来很可怕,我建议使用指定完整列列表的查询。但是您不需要自己输入所有字段:使用SQL Server Management Studio,右键单击对象资源管理器中的表,然后选择菜单项“脚本表为| INSERT到|新查询窗口”。

这会给你这样的东西:

INSERT INTO [dbo].[TableOfficerLogs]
           ([UniqueColID]
           ,[OtherField1]
           ,[OtherField2] -- etc.
           ,[OtherFieldN]
     VALUES
           (<UniqueColID, int,>
           ,<OtherField1, nvarchar(200),>
           ,<OtherField2, nvarchar(200),> --etc.
           ,<OtherFieldN, nvarchar(200),>)

不要让这吓到你 - 你仍然不会手动输入所有的值。现在单独离开该窗口一秒钟,然后返回到对象资源管理器。使用同一个表上的上下文菜单,获取另​​一个脚本:“脚本表为| SELECT To |新查询窗口”。这将是一个完全标准的选择列表,列出您的所有字段。复制整个查询并将其粘贴到第一个查询窗口中的VALUES子句上。

这将为您提供一个完整的INSERT ... SELECT查询,其中列出了所有字段。现在,只需根据需要替换SELECT部分​​中的UniqueColID。

此外,如果您事先知道新的UniqueColID值,请在FROM子句中加入它们(表示为表值参数,如果您在sproc中执行所有这些操作):您将最终得到尽可能多的重复项,每个都有你指定的ID。

<强>更新

两个“脚本表作为”操作将为您提供的内容是这样的,列出了所有字段:

INSERT INTO [dbo].[TableOfficerLogs]
               ([UniqueColID]
               ,[OtherField1]
               ,[OtherField2] -- etc.
               ,[OtherFieldN]
SELECT [UniqueColID]
      ,[OtherField1]
      ,[OtherField2] -- etc.
      ,[OtherFieldN]

现在,要实际复制,你就会修补它。您的代码可能最终看起来像这样:

CREATE PROCEDURE [dbo].[InsertDuplicateFields]        
    (@UniqueColID varchar(50), @NewUniqueColID varchar(50))         
AS    

INSERT INTO [dbo].[TableOfficerLogs]
               ([UniqueColID]
               ,[OtherField1]
               ,[OtherField2] -- etc.
               ,[OtherFieldN]
SELECT @NewUniqueColID
      ,[OtherField1]
      ,[OtherField2] -- etc.
      ,[OtherFieldN]
WHERE UniqueColID = @UniqueColID

这将复制指定的行并替换旧ID的新ID。当然,您将为8个表中的每个表重复此过程。

答案 1 :(得分:1)

当您的应用程序生成原始的UniqueColID时,我建议它也传递新的ID。

CREATE PROCEDURE [dbo].[InsertDuplicateFields] 
    (@UniqueColID varchar(50), @NewUniqueColID varchar(50), @IndividualID varchar(50) = null)
AS
Begin           
    SELECT *
    INTO TempTable
    FROM TableCollisionBegin 
    WHERE [UniqueColID] = @UniqueColID

    UPDATE TempTable SET [UniqueColID] = @NewUniqueColID

    INSERT INTO TableCollisionBegin
        SELECT * 
        FROM TempTable

    DROP TABLE TempTable

    ...
End