-3

C# で以下のストアド プロシージャを記述する方法

クラスライブラリファイルを作成しています。私は状況を取得します....スクリプトファイルをクライアントに提供しないでください....そのため、C#コードでSPを作成する必要があります。私は必死にそれをC#アセンブリに保持したいのですが、これが可能かどうか教えてください

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[AdjustTax]') AND type in (N'P', N'PC'))

DROP PROCEDURE [dbo].[AdjustTax]

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO
CREATE PROCEDURE [dbo].[AdjustTax] 

    @IN_SOPType       INT,
    @IN_SOPNo         VARCHAR(21),
    @IN_AdjustAmount  NUMERIC(19,5),
    @O_iError         INT OUTPUT  

AS

BEGIN

  DECLARE @Sequence       INT,

          @FunctionalAmt  NUMERIC(19,5),
          @OriginalAmt    NUMERIC(19,5),
          @TaxDetail      VARCHAR(30),
          @TaxAmt         NUMERIC(19,5),
          @CreditAmt      NUMERIC(19,5),
          @DexRowIDSOP    INT,
          @SOPHdrTbl      VARCHAR(20)  

    SET NOCOUNT ON;

BEGIN TRANSACTION

    SET @O_iError = 0  

    SELECT @SOPHdrTbl = RTRIM(DB_NAME()) + '.dbo.SOP10100'


    SELECT @DexRowIDSOP = DEX_ROW_ID 

      FROM SOP10100 (nolock)

        WHERE SOPTYPE=@IN_SOPType AND SOPNUMBE=@IN_SOPNo


    IF (EXISTS(SELECT 1 FROM tempdb..DEX_LOCK (NOLOCK) WHERE table_path_name = @SOPHdrTbl AND row_id = @DexRowIDSOP))

    BEGIN  

      SET @O_iError = 2022 

    END

    ELSE

    BEGIN   

      SET @FunctionalAmt = @IN_AdjustAmount

      SET @OriginalAmt   = @IN_AdjustAmount     

      UPDATE SOP10100 

        SET TAXAMNT  = TAXAMNT   + @FunctionalAmt,

            DOCAMNT  = DOCAMNT   + @FunctionalAmt,

            ACCTAMNT = ACCTAMNT  + @FunctionalAmt,

            ORTAXAMT = ORTAXAMT  + @OriginalAmt, 

            ORDOCAMT = ORDOCAMT  + @OriginalAmt,  

            ORACTAMT = ORACTAMT  + @OriginalAmt  

          WHERE SOPTYPE=@IN_SOPType AND SOPNUMBE=@IN_SOPNo  

      SELECT TOP 1 @TaxDetail = TAXDTLID, @TaxAmt = STAXAMNT

        FROM SOP10105

          WHERE SOPTYPE=@IN_SOPType AND SOPNUMBE=@IN_SOPNo

        ORDER BY LNITMSEQ


      UPDATE SOP10105

        SET STAXAMNT = STAXAMNT + @FunctionalAmt,

            ORSLSTAX = ORSLSTAX + @OriginalAmt      -- Currently the same as Functional Amount

          WHERE SOPTYPE=@IN_SOPType AND SOPNUMBE=@IN_SOPNo 

            AND LNITMSEQ=0

            AND TAXDTLID=@TaxDetail     

      SELECT TOP 1 @Sequence = SEQNUMBR, @CreditAmt=CRDTAMNT

        FROM SOP10102

          WHERE SOPTYPE=@IN_SOPType AND SOPNUMBE=@IN_SOPNo

            AND DISTTYPE=9 

            AND ((DEBITAMT + CRDTAMNT) = @TaxAmt) 


      IF (@CreditAmt <> 0) 
      BEGIN

        UPDATE SOP10102

          SET CRDTAMNT = CRDTAMNT + @FunctionalAmt,

              ORCRDAMT = ORCRDAMT + @OriginalAmt  

          WHERE SOPTYPE=@IN_SOPType AND SOPNUMBE=@IN_SOPNo

            AND SEQNUMBR=@Sequence
      END

      ELSE

      BEGIN 

        UPDATE SOP10102

          SET DEBITAMT = DEBITAMT + @FunctionalAmt,

              ORDBTAMT = ORDBTAMT + @OriginalAmt    

          WHERE SOPTYPE=@IN_SOPType AND SOPNUMBE=@IN_SOPNo

            AND SEQNUMBR=@Sequence
      END 

      SELECT TOP 1 @Sequence = SEQNUMBR, @CreditAmt=CRDTAMNT
        FROM SOP10102

          WHERE SOPTYPE=@IN_SOPType AND SOPNUMBE=@IN_SOPNo
            AND DISTTYPE=2 AND ((DEBITAMT + CRDTAMNT) > 0.0)

      IF (@CreditAmt <> 0) 
      BEGIN
        UPDATE SOP10102

          SET CRDTAMNT = CRDTAMNT + @FunctionalAmt,
              ORCRDAMT = ORCRDAMT + @OriginalAmt   

          WHERE SOPTYPE=@IN_SOPType AND SOPNUMBE=@IN_SOPNo
            AND SEQNUMBR=@Sequence
      END
      ELSE
      BEGIN 
        UPDATE SOP10102

          SET DEBITAMT = DEBITAMT + @FunctionalAmt,

              ORDBTAMT = ORDBTAMT + @OriginalAmt   

          WHERE SOPTYPE=@IN_SOPType AND SOPNUMBE=@IN_SOPNo

            AND SEQNUMBR=@Sequence
      END            
    END

IF (@O_iError = 0)

  COMMIT TRANSACTION

ELSE

  ROLLBACK TRANSACTION

END

GO
4

2 に答える 2

5

そもそもなぜC#で書くのですか?

DBスキーマを管理する場合は、VisualStudioDatabaseプロジェクトを使用してください

どうしてもC#アセンブリに保持したい場合は、別の.sqlファイルを作成し、リソースとして埋め込み、C#に文字列としてロードします。

ファイルのプロパティで、ビルドアクション埋め込みリソースに変更し、次のコードを使用してロードします

using (Stream stream = Assembly.GetExecutingAssembly()
                               .GetManifestResourceStream("Your assembly namespace" + "file.sql"))
using (StreamReader reader = new StreamReader(stream))
{
    string result = reader.ReadToEnd();
}
于 2012-12-12T11:37:04.470 に答える
0

明確で理解しやすい限り、300行のSPで問題ありません。

SPの大部分では、コメントを書くことをお勧めします

于 2012-12-12T11:37:41.300 に答える