5

テーブルのPKに基づいてテーブルのレコードを更新するストアドプロシージャ(SQL Server 2008 R2)を作成したいと思います。

ストアドプロシージャには、たとえば、次の4つのパラメータがあります。

@ID int,
@Name nvarchar(50),
@Email nvarchar(80),
@Phone nvarchar(20)

ストアドプロシージャの呼び出し元が1つ(または複数)のパラメーターにNULL値を渡すかどうかと、呼び出し元が1つ(または複数)のパラメーターに何も渡さなかったかどうかを判断するにはどうすればよいですか?

C#の発信者の例:

発信者は以下を指定NULLします@Phone

using (SqlCommand cmd = new SqlCommand())
{
  cmd.CommandType = System.Data.CommandType.StoredProcedure;
  cmd.CommandText = "EditPerson";
  cmd.Parameters.AddWithValue("@ID", id);
  cmd.Parameters.AddWithValue("@Name", 'Frank');
  cmd.Parameters.AddWithValue("@Email", 'frank@frank.com');
  cmd.Parameters.AddWithValue("@Phone", DBNull.Value);
  DatabaseManager.instance.ExecuteScalarQuery(cmd);
}

@Phone呼び出し元はパラメーターを無視します。

using (SqlCommand cmd = new SqlCommand())
{
   cmd.CommandType = System.Data.CommandType.StoredProcedure;
   cmd.CommandText = "EditPerson";
   cmd.Parameters.AddWithValue("@ID", id);
   cmd.Parameters.AddWithValue("@Name", 'Frank');
   cmd.Parameters.AddWithValue("@Email", 'frank@frank.com');
   DatabaseManager.instance.ExecuteScalarQuery(cmd);
}

ここで達成しようとしているのは、呼び出し元がパラメーターにNULL値を明示的に指定した場合、レコードをNULL値で更新することです。ただし、ユーザーがパラメーターの受け渡しを明示的に無視した場合、UPDATEクエリは特定のレコードに既に設定されているフィールド/列の値を保持します(つまり、クエリはその特定の列を更新しません)。

呼び出し元が決して使用しないと安全に想定できるデフォルト値を指定できると思います-次のようになります。

@ID int,
@Name nvarchar(50) = 'NameIsUndefined',
@Email nvarchar(80) = 'EmailIsUndefined',
@Phone nvarchar(20) = 'PhoneIsUndefined'

次に、ストアドプロシージャで、未定義の値を確認できます。パラメータvarsがまだ、、、および/または値NameIsUndefinedに設定されている場合は、呼び出し元がこれらのパラメータの値を明示的に定義していないと安全に推測できます。これが私の目標を達成する唯一の方法ですか?EmailIsUndefinedPhoneIsUndefined

4

2 に答える 2

6

EXECこのように(デフォルト値なしで)パラメーターを宣言すると、ストアード・プロシージャーは4つすべてを必要とし、プロバイダーによって作成されたステートメントにパラメーターのいずれかが渡されない場合は失敗します。

次のように、いくつかのパラメータをオプションとして宣言できます。

@Phone nvarchar(20) = NULL

ただし、sproc内で省略されているか、明示的にに設定されているかを判断する方法はありませんNULL

于 2011-08-12T17:07:27.627 に答える
1

SQL Server、AFAIKではNULLとNULLの違いを区別する方法はありません。

C#コードでは、A)空の文字列などの別の値を渡して、空の値が渡されたことを示します。次に、SQLでそれを処理して、値が渡された場合はDBにNULLを書き込み、値が渡された場合は前の値を保持します。変数がNULL、またはB)を渡す代わりにDBNull.Value、DBから読み取られた前の値を渡します。

于 2011-08-12T17:08:54.547 に答える