0

xml を入力として受け取るストアド プロシージャがあります。

SP を実行する C# コードは次のとおりです。

using (SqlConnection conn = new SqlConnection(connString))
{
    try
    {
        conn.Open();
        SqlCommand command = new SqlCommand("sp_Configure_Users", conn);
        command.CommandType = CommandType.StoredProcedure;
        var xmlData = new SqlParameter(parameterName: "@XMLDATA", value: GenerateXML(_userDetails));
        command.Parameters.Add(xmlData);

        count = command.ExecuteNonQuery();
        if (count > 0)
        {
            return count;
        }
        else
        {
            return 0;
        }
    }
    catch (SqlException  )
    {

    }
}

メソッド GenerateXML は、xml データの形式の文字列を返します。私のストアド プロシージャでは、SET NOCOUNT ON を削除して、挿入、削除、または更新されたときに実際の行数を返しました。サンプルの xml データでクエリを実行した場合:-

<UserCollection>
    <InsertList><Users User_Id="438"  First_Name="Praveen"  Middle_Name=""  Last_Name="Kumar"  Designation_Id="1"  Email="" Contact_Number="96533"  Updated_By="pkumar"  />
    </InsertList>
    <UpdateList></UpdateList>
    <DeleteList></DeleteList>
</UserCollection>

私のコレクションでは、挿入する必要がある単一の行のみを渡すため、返される値は 1 ではなく 3 です。

保存されたProcは

  set ANSI_NULLS ON
  set QUOTED_IDENTIFIER ON
   go



  ALTER PROCEDURE [dbo].[sp_Configure_Users]
@XMLDATA xml
  AS
 DECLARE @Users_Staging Table(
[User_Id] [int] NOT NULL,
[First_Name] [varchar](200) NOT NULL,
[Middle_Name] [varchar](200) NULL,
[Last_Name] [varchar](200) NOT NULL,
[Designation_Id] [int] NOT NULL,
[Email] [varchar](250) NOT NULL,
[Contact_Number] [varchar](50) NOT NULL,
[Updated_By] [varchar](255) NOT NULL
  )

  BEGIN

  Set nocount off
  Go    

  BEGIN TRY
  BEGIN TRANSACTION


  DECLARE @CurrDate datetime;
  SELECT @CurrDate = GETDATE();
   -- Insert statements for procedure 
  INSERT INTO Users
  ([User_Id]
  ,[First_Name]
  ,[Middle_Name]
  ,[Last_Name]
  ,[Designation_Id]
  ,[Email]
  ,[Contact_Number]
  ,[Updated_By]
  ,[Updated_Date]
  )
  Select    
XMLDATA.item.value('@User_Id[1]', 'int') AS User_Id,    
XMLDATA.item.value('@First_Name[1]', 'varchar(200)') AS First_Name,
XMLDATA.item.value('@Middle_Name[1]', 'varchar(200)') AS Middle_Name,
XMLDATA.item.value('@Last_Name[1]', 'varchar(200)') AS Last_Name,
XMLDATA.item.value('@Designation_Id[1]', 'int') AS Designation_Id,
XMLDATA.item.value('@Email[1]', 'varchar(250)') AS Email,
XMLDATA.item.value('@Contact_Number[1]', 'varchar(50)') AS Contact_Number,
XMLDATA.item.value('@Updated_By[1]', 'varchar(255)') AS Updated_By,
@CurrDate
  FROM @XMLDATA.nodes('//UserCollection/InsertList/Users') AS XMLDATA(item)

  -- Update statements for procedure 

  INSERT INTO @Users_Staging
       ([User_Id]
  ,[First_Name]
  ,[Middle_Name]
  ,[Last_Name]
  ,[Designation_Id]
  ,[Email]
  ,[Contact_Number]
  ,[Updated_By])

Select  
XMLDATA.item.value('@User_Id[1]', 'int') AS User_Id,    
XMLDATA.item.value('@First_Name[1]', 'varchar(200)') AS First_Name,
XMLDATA.item.value('@Middle_Name[1]', 'varchar(200)') AS Middle_Name,
XMLDATA.item.value('@Last_Name[1]', 'varchar(200)') AS Last_Name,
XMLDATA.item.value('@Designation_Id[1]', 'int') AS Designation_Id,
XMLDATA.item.value('@Email[1]', 'varchar(250)') AS Email,
   XMLDATA.item.value('@Contact_Number[1]', 'varchar(50)') AS Contact_Number,
XMLDATA.item.value('@Updated_By[1]', 'varchar(255)') AS Updated_By
  FROM @XMLDATA.nodes('//UserCollection/InsertList/Users') AS XMLDATA(item)


  UPDATE Users 
  SET First_Name=stgusr.First_Name,
  Middle_Name=stgusr.Middle_Name,
  Last_Name=stgusr.Last_Name,
  Email=stgusr.Email,
  Contact_Number=stgusr.Contact_Number,
  Updated_By=stgusr.Updated_By,
  Updated_Date=@CurrDate
  FROM Users usr INNER JOIN
  @Users_Staging stgusr
  ON usr.User_Id=stgusr.User_Id

-- Delete statements for procedure 

   DELETE Users
   WHERE User_Id
     IN (Select         
    XMLDATA.item.value('@User_Id[1]', 'int') AS User_Id
FROM @XMLDATA.nodes('//UserCollection/DeleteList/Users') AS XMLDATA(item))

   COMMIT TRANSACTION;

   END TRY

   BEGIN CATCH
--EXEC sp_rethrow_error;
ROLLBACK TRANSACTION;
    END CATCH; 
   END
4

1 に答える 1

1

ストアド プロシージャによって更新/挿入されたテーブルにトリガーがある場合、それらは影響を受ける行数に影響します。

UPDATE、INSERT、および DELETE ステートメントの場合、戻り値はコマンドによって影響を受けた行の数です。挿入または更新されるテーブルにトリガーが存在する場合、戻り値には、挿入操作または更新操作の両方によって影響を受ける行数と、トリガーまたはトリガーによって影響を受ける行数が含まれます。他のすべてのタイプのステートメントの場合、戻り値は -1 です。ロールバックが発生した場合、戻り値も -1 です。
参照

関連するテーブルのストアド プロシージャとスキーマ/トリガーを投稿することをお勧めします。

于 2012-05-20T14:26:56.003 に答える