2017-10-18 7 views
0

J'ai ce SPSQL générer identifiant unique lors de la copie de plusieurs enregistrements

CREATE PROCEDURE ApplyExistingImageAcrossModel 
@capidfrom int, 
@capidto int, 
@type int 
AS 
BEGIN 

DECLARE @imageid uniqueidentifier 

INSERT INTO ImageMetaData 
(ImageId,CapId,[Type],Source,DateAdded,OriginalFileName,OriginalUrl,isDefault,Height,Width,ViewType,CapImageId,islive) 
SELECT @imageid,@capidto,@type,source,GETDATE(),originalfilename,originalurl,isdefault,height,width,viewtype,capimageid,islive 
FROM ImageMetaData 
WHERE [type] = @type AND capid = @capidfrom 

INSERT INTO ImageData 
(ImageId,ImageBinary) 
SELECT @imageid,ImageBinary 
FROM ImageData A 
LEFT JOIN ImageMetaData B 
ON A.ImageId = B.ImageId 
WHERE B.[type] = @type 
AND B.capid = @capidfrom 

END 

Le problème est que la sélection peut retourner plusieurs enregistrements pour un capid, et je veux particulièrement les copier, mais chaque enregistrement a besoin d'un @imageid que je ne génère qu'une seule fois, je dois utiliser ce imageid dans les deux tableaux.

Merci

+0

Je ne suis pas sûr si c'est un doublon ou non - Si c'est s'il vous plaît laissez-moi savoir: https://stackoverflow.com/a/34832231/3094533 –

+1

Je suggère d'utiliser de meilleurs alias que A, B. http: //sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-table-aliases-like-abc-or-t1-t2-t3.aspx Avez-vous envisagé d'utiliser le Clause OUTPUT de votre insertion initiale? https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql –

Répondre

0

création au lieu d'une variable, déclarer variable de table pour stocker les identifiants uniques. Ensuite, utilisez la clause OUPUT pour enregistrer tous les ID. Quelque chose comme ceci:

DECLARE @DataSource TABLE 
(
    @imageid uniqueidentifier 
); 

INSERT INTO ImageMetaData(ImageId,CapId,[Type],Source,DateAdded,OriginalFileName,OriginalUrl,isDefault,Height,Width,ViewType,CapImageId,islive) 
OUTPUT inserted.ImageId 
INTO @DataSource (@imageid) 
SELECT NEWID(),@capidto,@type,source,GETDATE(),originalfilename,originalurl,isdefault,height,width,viewtype,capimageid,islive 
FROM ImageMetaData 
WHERE [type] = @type AND capid = @capidfrom 

Maintenant, dans le tableau @DataSource nous avons les insérés imageID s. Faites avec eux tout ce que vous voulez.