2016-08-08 10 views
0

これに少し助けが必要です。ストアドプロシージャは、以下のこれまでの一意の識別子を出一致していないよう不正なID guidを返すストアドプロシージャ

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 

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()); 

それは声明が今まで真ならない場合最初のようだが、もしでテスト(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id)一致するUIDはデータで返されます。

+0

のですか?常に新しいレコードを挿入することになるのでしょうか? –

+0

はい、どうなりますか。 – rdm

答えて

1

この文には問題がある,,

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

@idは、出力パラメータであり、デフォルトではnullであり、あなたはそれをチェックしようとしている。..

基本的に NEWID()が重複することはありません

ので、更新一部は冗長です

+0

それでは、@ IDのインキング・データを認識できないのはなぜですか?どのように私はこれを軽減するだろうか? @IDへの送信データに別の変数を使用するか、この問題を処理するための別のベストプラクティスが必要ですか。 – rdm

+0

あなたが挿入しようとしているnewid()が存在するかどうかを確認する場合は、何も渡していません。無視することができます – TheGameiswar

+0

@IDの内容をテストしてデータベースに存在するかどうかを確認しますそれが存在すれば挿入し、それがなければ挿入する。 – rdm

0

コードでどのようにパラメータを宣言していますか?それはParameterDirection.Outputですか?

ParameterDirection.InputOutputに変更してください。あなたのSQLは大丈夫です。 は、ストアドプロシージャのOUTPUTとして宣言されたパラメータに入力値を渡すことができます。だから多分それはちょうどそのParameterDirectionです。

また、あなたのID列がNULL可能でない場合、同じいずれかのように動作するようになるだろう

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

にこの

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

を変更することができます。しかしこれはもう少し明白で、@IdはOUTPUTパラメータであるためnullである可能性があることを示しています。

0

これは私の修正です。 これは、あなたがそれが `true`をを返すことはありません知っていますどのように私の新しいストアドプロシージャ

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 

と相対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(); 
関連する問題