Gespeicherte Prozedur, die falsche ID-Guid zurückgibt

Ich brauche ein wenig Hilfe damit. Die unten aufgeführte gespeicherte Prozedur scheint niemals mit einer eindeutigen Kennung übereinstimmen zu können

ALTER PROCEDURE [dbo].[spInsertUpdateThisStuff] @Id uniqueidentifier OUTPUT, @Content nvarchar(255) AS BEGIN SET NOCOUNT ON; DECLARE @tAudit table (id uniqueidentifier) IF EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id) -- UPDATE BEGIN UPDATE [dbo].[myData] SET [ID] = @ID, [Content] = @Content OUTPUT inserted.[ID] INTO @tAudit WHERE [ID] = @Id SELECT id FROM @tAudit END ELSE BEGIN -- INSERT SET @ID = NEWID() INSERT INTO [dbo].CBData ([ID], [Content]) OUTPUT inserted.[ID] INTO @tAudit VALUES(@Id, @Content) SELECT id FROM @tAudit END; SET @ID = (SELECT id FROM @tAudit); END 

die C #

 cmd.Parameters.Add("@ID", SqlDbType.UniqueIdentifier).Value = (currentRecord.ID == null) ? Guid.Empty : currentRecord.ID; cmd.Parameters["@ID"].Direction = ParameterDirection.Output; cmd.ExecuteNonQuery(); currentRecord.ID = Guid.Parse(cmd.Parameters["@ID"].Value.ToString()); 

Es scheint, dass die erste IF-statement nicht immer wahr wird, aber wenn Test ( SELECT * FROM [dbo].[myData] WHERE [ID] = @Id ) mit einer passenden UID kommt es mit data zurück.

Diese Aussage ist problematisch,

  DECLARE @tAudit table (id uniqueidentifier) IF EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id) -- UPDATE BEGIN 

@id ist ein Output-Parameter und ist null standardmäßig und du versuchst zu überprüfen, dass ..

Grundsätzlich wird NEWID() nicht dupliziert, so dass der Update-Teil redundant ist

Wie erklären Sie den Parameter in Ihrem Code? Ist es ParameterDirection.Output ?

Versuchen Sie, es in ParameterDirection.InputOutput ändern. Dein SQL sieht ok aus. Und Sie können einen Eingabewert an einen als OUTPUT deklarierten OUTPUT in Ihrer gespeicherten Prozedur übergeben. Vielleicht ist es einfach nur diese ParameterDirection .

Sie können das auch ändern

 IF EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id) 

nach

 IF @Id IS NOT NULL AND EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id) 

Wenn deine ID-Spalte nicht nullable ist, dann wird es gleich gehen. Aber das ist ein wenig expliziter und zeigt, dass es erkannt wird, dass @Id null sein könnte, weil es ein OUTPUT-Parameter ist.

Das ist meine Verlegenheit. Dies ist meine neue gespeicherte Prozedur

 ALTER PROCEDURE [dbo].[spInsertUpdatemyData] @ID uniqueidentifier, @IDOut uniqueidentifier OUTPUT, @CONTENT nvarchar(255) AS BEGIN --SET NOCOUNT ON; DECLARE @tAudit table (outputID uniqueidentifier) IF EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @ID) -- UPDATE BEGIN UPDATE [dbo].[CBData] SET [ID] = @ID, [Content] = @Content OUTPUT inserted.[ID] INTO @tAudit WHERE [ID] = @ID SELECT outputID FROM @tAudit; END ELSE BEGIN -- INSERT INSERT INTO [dbo].myData ([ID],[Content]) OUTPUT inserted.[ID] INTO @tAudit VALUES(NEWID(),@Content); SELECT outputID FROM @tAudit END; set @IDOut = (SELECT outputID FROM @tAudit); END 

und die relative C #

  //Add Parameter for output to sql command then Change Direction of parameter cmd.Parameters.Add("@IDOut", SqlDbType.UniqueIdentifier).Value = Guid.Empty ; cmd.Parameters["@IDOut"].Direction = ParameterDirection.InputOutput; cmd.ExecuteNonQuery(); currentRecord.ID = Guid.Parse(cmd.Parameters["@IDOut"].Value.ToString()); cmd.Transaction.Commit();