2013-10-13 39 views
0
CREATE TYPE [dbo].[JNLOBJLIST] AS TABLE(
    [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) 
GO 

和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 

實際上是我第一次插入語句之後,我需要tbl_GL_Trans_Detailstemp的 主鍵GL_trans_id的價值將它插入到一個表...

因此,如果類型表@LIST有很多行(比如說5),我需要所有的語句一個接一個地執行(作爲一個循環的作用)

但是至少我已經檢查過第一個插入語句起初作爲一個整體,然後onl y下一個陳述得到執行。我如何克服這一點?

爲了更精確,我需要它採用以下邏輯

CREATE PROCEDURE [dbo].[usp_insertGl_transtemp2] 
@LIST [dbo].JNLOBJLIST READONLY, 
@COUNT int 
AS 
DECLARE @id int 
DECLARE @rowcount int=0 
WHILE @rowcount<@COUNT 
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    @rowcount.strTransRefNumber 
        , @rowcount.dateGLTransDate 
        , @rowcount.decGLTransAmount 
        , @rowcount.strGLTransRemark 
        , @rowcount.guidCompanybranchId 
        , @rowcount.intGLAccountId 
        , @rowcount.intFiscalYearId 
        , @rowcount.boolGLIsDebit 
        , @rowcount.strPerson 
        , @rowcount.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 @rowcount.decGLTransAmount2 FROM @LIST) 
WHERE (GL_Account_id = (SELECT @rowcount.intGLAccountId FROM @LIST)) 

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

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

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

SET @rowcount = @rowcount + 1 
END 
RETURN 
+0

你在寫SQL ** **(結構化查詢語言)和真是指由此產生的Microsoft ** SQL Server **(實際產品)?如果是:請添加'sql-server'標籤來清除。如果不是:**數據庫系統是用來做什麼的? –

回答

1

它可能會以避免循環和從第一INSERT在隨後的查詢上使用的OUTPUT的溶液。以下示例基於@list.strTransRefNumberUNIQUE的猜測。即使它不是UNIQUE它仍然有可能爲你重構在最後INSERTJOIN你知道事物的相互關係等

CREATE PROCEDURE [dbo].[usp_insertGl_transtemp2] 
@list [dbo].JNLOBJLIST READONLY 
AS  
BEGIN 
    BEGIN TRAN 
     DECLARE @inserted TABLE (id INT NOT NULL, strTransRefNumber VARCHAR(50) NOT NULL) 

     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) 
     OUTPUT INSERTED.GL_trans_id, INSERTED.trans_ref_number INTO @inserted 
     SELECT strTransRefNumber, dateGLTransDate, decGLTransAmount, strGLTransRemark 
      , guidCompanybranchId, intGLAccountId, intFiscalYearId, boolGLIsDebit 
      , strPerson, inttblReferenceId 
     FROM @list 

     -- refactored it to use a join which i think is what you need here 
     UPDATE a 
     SET a.GL_Balance = a.GL_Balance + l.decGLTransAmount2 
     FROM tbl_Gl_account a 
     JOIN @list l ON l.intGLAccountId = a.GL_Account_id 

     INSERT INTO tbl_Journal_Details 
      (Journal_Master_Id, Trans_Id, Amount, Memo) 
     SELECT l.Journal_Master_Id, i.id, l.decGLTransAmount, l.strJournalmemo 
     FROM @list l 
     JOIN @inserted i ON i.strTransRefNumber = l.strTransRefNumber 
    COMMIT 
END 
RETURN 
+0

'OUTPUT INSERTED.GL_trans_id,INSERTED.trans_ref_number INTO @inserted 'INSERTED附近無效的語法...此解決方案將滿足我的需求。你能幫我弄清楚嗎?也請告訴我這整個querry的返回值是什麼?(只有1或0表示成功?) – gjijo

+0

道歉我修復了錯誤。該程序將返回1或0 –

+0

謝謝你的支持。你給我的解決方案工作,我的問題解決了。 – gjijo

相關問題