0

コマンド使用時に動作する置換機能

exec MyStoredProcedure param1, param2, 

など... しかし、C# コードで実行すると、テキストが適切に置き換えられないため、実際のコメントではなく @@Comments というメールが届きます。SQL Server 2008 で確認しようとしましたが、正常に動作し、電子メールも正常に送信されます。確認する必要があることはありますか?

ここに私のC#コードがあります:

public static void SetRequestStatusChange(int reqID, int newStatus, string assignTo)
{
    SqlConnection con = new SqlConnection(connectionString);
    SqlCommand cmd = new SqlCommand("spUpdateRequest", con);
    cmd.CommandType = CommandType.StoredProcedure;

    // Status
    cmd.Parameters.Add(new SqlParameter("@RequestNo", SqlDbType.Int, 4));
    cmd.Parameters["@RequestNo"].Value = 276;

    // Queue
    cmd.Parameters.Add(new SqlParameter("@userID", SqlDbType.NVarChar, 12));
    cmd.Parameters["@userID"].Value = "1091912";

    // State
    cmd.Parameters.Add(new SqlParameter("@RequestStatus", SqlDbType.Int, 4));
    cmd.Parameters["@RequestStatus"].Value = 2;

    // Buyer Emp ID
    cmd.Parameters.Add(new SqlParameter("@assignedTo", SqlDbType.NVarChar, 12));
    cmd.Parameters["@assignedTo"].Value = "1091912";

    try
    {
        con.Open();
        cmd.ExecuteNonQuery();
    }
    catch (SqlException err)
    {
        throw new ApplicationException("Data Error." + err.ToString());
    }
    finally
    {
        //close the connection 
        con.Close();
    }
}

これは、実際に置換を実行するストアド プロシージャの一部です。実際のストアド プロシージャは非常に長く、他の多くのストアド プロシージャを呼び出します (私は書きませんでした)。

select @html = replace(replace(replace(@html, '@@COMMENTS', case when @activityID <> 20 then  'The following comments were noted when the Request' else '' end +

   case @ActivityID when  2 then ' was submitted: ' +  case when requestorComments > '' then requestorComments  else 'None' end
   when 0 then '' 
   when  4 then ' was edited: ' + isnull(L.Comments,  'None') 
   when  15 then ' was edited: ' + isnull(LL.Comments,  'None') 
   when  20 then ''
   when  21 then  ' material was returned: ' + case when dbo.fnLastComment(lamSpecRecallComments) > '' then replace(dbo.fnLastComment(lamSpecRecallComments),':',':  ') else 'None' end
   when  -21 then  ' material was returned: ' + case when dbo.fnLastComment(lamSpecRecallComments) > '' then replace(dbo.fnLastComment(lamSpecRecallComments),':',':  ') else 'None' end
   when  8 then ' was approved: ' + case when ccMgrCOmments > '' then ccMgrCOmments  else 'None' end
   when  9 then ' was approved: ' + case when lamAprCOmments > '' then lamAprCOmments  else 'None' end
   when 13 then ' was stored: ' + case when dbo.fnLastComment(lamSpecCOmments) > '' then dbo.fnLastComment(lamSpecCOmments)  else 'None' end
   when -8 then ' was closed: ' + case when ccMgrCOmments > '' then ccMgrCOmments  else 'None' end
   when -9 then ' was closed: ' + case when lamAprCOmments > '' then lamAprCOmments  else 'None' end
   else '' end), 

   '@@PLEASE',
   case when @activityID =  8 or @activityID = 9 or @activityID = 20 or @activityID = 2  then 'Please click the link below to view the Request and ensure it is worked expeditiously.'
   else '' end),'@@RECALL',@list)  

   from (select * from strgRequests where requestNumber = @requestID) r
   left join (select * from  ActivityLog  where TransactionID = @transactionID) L on 1 = 1
   left join (select * from  ActivityLineItemLog where TransactionID = @transactionID) LL on 1 = 1

@@コメント、@@RECALL、@@テーブルから来てください。これにより、メールをカスタマイズできます。

4

1 に答える 1

0

「@@」は通常、グローバル/デフォルト変数に使用されます。「@」は通常、パラメーターに使用されます。

確認するには、さらにコードを確認する必要があります。私の本能は、@@ を @ に切り替えることが、これを整理するために取るべき次の方向であると教えてくれます。

また、フィールドの値が「@@Comments」の場合、次のようなコードがどこかにある可能性があります。

set @cmd=`insert into Table (field,field,field) values ('somethinguseful','@@Comments','more stuff')

実行者(@cmd)

これには 2 つの問題があります。

  1. @@Comments を翻訳しませんでした
  2. あなたは注射を受けやすいです。

次のようなものを使用します。

execute sp_executesql N'insert into Table (field,field,field) values (@var1,@var2,@var3)' ,N'@var1 varchar(256)' , @var1=@Comments ...

于 2012-05-23T18:14:22.753 に答える