0
CREATE TABLE [Target]
     (
     [ID] [int] NOT NULL PRIMARY KEY IDENTITY,
     [FirstName] [varchar](100)NOT NULL,
     [LastName] [varchar](100)NOT NULL,
     [Email] [varchar](200) NOT NULL
     )
    CREATE TYPE [TargetUDT] AS TABLE
     (
     [FirstName] [varchar](100)NOT NULL,
     [LastName] [varchar](100)NOT NULL,
     [Email] [varchar](200) NOT NULL
     )
     CREATE PROCEDURE AddToTarget(@TargetUDT TargetUDT READONLY)
     AS
     BEGIN
           INSERT INTO [Target]
           SELECT * FROM @TargetUDT
     END

这是我在 stackoverflow 中找到的 1 个帖子的答案。

考虑到我有 10 行类型表“TargetUDT” BEGIN-END 是否充当循环?我的意思是插入是否逐行工作?我需要对每一行进行某些计算。计算可能会逐行变化。那么我可以将它们放在 BEGIN 和 END 之间吗?

我将在下面给出我的代码

foreach (MdlGeneralLedger objJournalDetail in objJouranlDetails)
                {
                    MdlGeneralLedger objTransDetails = new MdlGeneralLedger();
                    objTransDetails.intGLAccountId = objJournalDetail.intGLAccountId;
                    objTransDetails.dateGLTransDate = objJournalEntry.dtjournalDate;
                    if (objJournalDetail.decDebitAmount != 0)
                    {
                        objTransDetails.decGLTransAmount = objJournalDetail.decDebitAmount;
                        objTransDetails.boolGLIsDebit = true;
                    }
                    else
                    {
                        objTransDetails.decGLTransAmount = objJournalDetail.decCreditAmount;
                        objTransDetails.boolGLIsDebit = false;
                    }
                    objTransDetails.guidCompanybranchId = objJournalEntry.guidCompanybranchId;
                    objTransDetails.strGLTransRemark = "Journal Entry";
                    objTransDetails.boolGLIsActive = true;
                    objTransDetails.strTransRefNumber = objJournalEntry.strJournalReference;
                    objTransDetails.intFiscalYearId = objJournalEntry.intFiscalYearId;
                    objTransDetails.inttblReferenceId = (int)TblReference.JournalEntry;
                    objTransDetails.strPerson = "Vidya";
                    MdlGeneralLedger objGldetails_blnc = new MdlGeneralLedger();
                    objGldetails_blnc.intGLAccountId = objJournalDetail.intGLAccountId;
                    if (objTransDetails.boolGLIsDebit)
                        objGldetails_blnc.decGLTransAmount = objTransDetails.decGLTransAmount;
                    else
                        objGldetails_blnc.decGLTransAmount = -objTransDetails.decGLTransAmount;
                    objJournalDetail.decGLTransAmount = objTransDetails.decGLTransAmount;
                    temp.Rows.Add(count++,_intJouranlId, objTransDetails.strTransRefNumber, objTransDetails.dateGLTransDate, objGldetails_blnc.decGLTransAmount, objTransDetails.strGLTransRemark, objTransDetails.guidCompanybranchId, objTransDetails.intGLAccountId, objTransDetails.intFiscalYearId, objTransDetails.boolGLIsDebit, objTransDetails.strPerson, objTransDetails.inttblReferenceId, objJournalDetail.decGLTransAmount, objJournalDetail.strJournalmemo);
                }

public static DataTable tbl_mdl()
    {

        DataTable temp = new DataTable();
        //objTransDetails
        temp.Columns.Add("slno", typeof(int));
        temp.Columns.Add("Journal_Master_Id", typeof(int));
        temp.Columns.Add("strTransRefNumber", typeof(string));
        temp.Columns.Add("dateGLTransDate", typeof(DateTime));
        temp.Columns.Add("decGLTransAmount", typeof(decimal));
        temp.Columns.Add("strGLTransRemark", typeof(string));
        temp.Columns.Add("guidCompanybranchId", typeof(Guid));
        temp.Columns.Add("intGLAccountId", typeof(int));
        temp.Columns.Add("intFiscalYearId", typeof(int));            
        temp.Columns.Add("boolGLIsDebit", typeof(bool));            
        temp.Columns.Add("strPerson", typeof(string));
        temp.Columns.Add("inttblReferenceId", typeof(int));
        //objGldetails_blnc
        temp.Columns.Add("decGLTransAmount2", typeof(decimal));
        //objJournalDetail 
        temp.Columns.Add("strJournalmemo", typeof(string));
        return temp;

    }

设置细节.cs

public int InsertJournalEntryCheck(DataTable temp)
        {
            return privateInsertJournalEntryCheck(temp);
        }
        public int privateInsertJournalEntryCheck(DataTable temp)
        {
            SqlParameter objsqlparameter = new SqlParameter("@LIST", SqlDbType.Structured);
            objsqlparameter.Value = temp;
            if (base.Transaction != null)
            {
                return (int)_helper.ExecuteScalar(base.Transaction, CommandType.StoredProcedure, "usp_insertGl_transtemp2", objsqlparameter);
            }
            else
            {
                return (int)_helper.ExecuteScalar(base.ConnectionString, CommandType.StoredProcedure, "usp_insertGl_transtemp2", objsqlparameter);
            }
        }
                if (dalHelper.GetDAL_SettingDetails(true).InsertJournalEntryCheck(temp) == 0)
                {
                    dalHelper.EndConnectionAndRollBackTransaction();
                    return 0;
                }

现在我的sp:

    CREATE TYPE [dbo].[JNLOBJLIST] AS TABLE(
[slno] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Journal_Master_Id] [int] NULL,
[strTransRefNumber] [varchar](50) NULL,
[dateGLTransDate] [date] NULL,
[decGLTransAmount] [decimal](18, 4) NULL,
[strGLTransRemark] [varchar](50) NULL,
[guidCompanybranchId] [uniqueidentifier] NULL,
[intGLAccountId] [int] NULL,
[intFiscalYearId] [int] NULL,
[boolGLIsDebit] [binary](1) NULL,
[strPerson] [varchar](50) NULL,
[inttblReferenceId] [int] NULL,
[decGLTransAmount2] [decimal](18, 4) NULL,
[strJournalmemo] [varchar](50) NULL)

sp:

CREATE PROCEDURE [dbo].[usp_insertGl_transtemp2] 
@LIST [dbo].JNLOBJLIST READONLY

AS
DECLARE @id int

BEGIN

INSERT INTO tbl_GL_Trans_Detailstemp
                    ( trans_ref_number
                    , GL_trans_date
                    , GL_trans_amount
                    , GL_trans_remark
                    , company_branch_id
                    , GL_Account_id
                    , fiscal_year_id
                    , IsDebit
                    , Person
                    , tbl_reference_Id)

SELECT              strTransRefNumber
                    , dateGLTransDate
                    , decGLTransAmount
                    , strGLTransRemark
                    , guidCompanybranchId
                    , intGLAccountId
                    , intFiscalYearId
                    , boolGLIsDebit
                    , strPerson
                    , inttblReferenceId FROM @LIST

SET @id = (SELECT MAX(GL_trans_id)
FROM   tbl_GL_Trans_Detailstemp)


UPDATE    tbl_Gl_account
SET GL_Balance = GL_Balance + (SELECT decGLTransAmount2 FROM @LIST)
WHERE (GL_Account_id = (SELECT intGLAccountId FROM @LIST))

DECLARE @Journal_Master_Id int
DECLARE @Trans_Id int
DECLARE @Amount decimal
DECLARE @Memo varchar(50)

SET @Journal_Master_Id=(SELECT Journal_Master_Id FROM @LIST)
SET @Trans_Id=(@id)
SET @Amount=(SELECT decGLTransAmount FROM @LIST)
SET @Memo=(SELECT strJournalmemo FROM @LIST)

INSERT INTO tbl_Journal_Details
    (Journal_Master_Id, Trans_Id, Amount, Memo)
VALUES     (@Journal_Master_Id,@Trans_Id,@Amount,@Memo)

END
RETURN
4

1 回答 1

1

不,插入一次适用于所有行。您可以使用标量函数来计算您需要的内容,或者只进行内联计算,例如:

INSERT INTO [Target]
SELECT col1 * col2 - 4, col3 FROM @TargetUDT

如果这些不是选项,您可以使用 cursor(不是我最喜欢的解决方案,但有时很有用)。

于 2013-10-12T06:44:52.657 回答