2016-03-04 54 views
0

我想創建一個SQL語句,以基於select語句的結果插入多行到表中。使用聲明和選擇結果插入多行到表中

這樣做的目的是我們有2個表格應該包含與相同數據相關的數據行。我創建了一個語句來標識一個表中不在另一個表中的所有行,並在第二個語句中將這些行插入到第二個表中。

這兩項工作分別,我遇到的問題是,當我嘗試結合他們希望能在一個運行所有的插入去它成功,但只在搜索結果的第一行

IF OBJECT_ID('tempdb..#retentiontemp') IS NOT NULL 
    /* Then it exists */ 
    DROP TABLE #retentiontemp 

Select * 
Into #retentiontemp 
From  
    (SELECT VCHRNMBR,dex_row_id 
     FROM JCRFP100 
     WHERE VCHRNMBR NOT IN (SELECT VCHRNMBR FROM JC10500) 
    ) As VCHRNMBR 

declare @VENDORID char(15),@VCHRNMBR char(20), @DOCTYPE smallint, @BACHNUMB char(15), @ACTINDX int, @TAXDTLID char(15), @TAXAMNT numeric(19,5), @ORTAXAMT numeric(19,5), @PCTAXAMT numeric(19,5), @ORPURTAX numeric(19,5), @TDTTXPUR numeric(19,5), @ORTXBPUR int, @TXDTTPUR numeric(19,5), @ORTOTPUR numeric(19,5), @POSTED tinyint; 

select 

@VENDORID = VENDORID, 
@VCHRNMBR = VCHNUMWK, 
@DOCTYPE = DOCTYPE, 
@BACHNUMB = BACHNUMB, 
@TAXDTLID = Taxschid, 
@TAXAMNT = TAXAMNT, 
@TDTTXPUR = CURTRXAM, 
@ORTXBPUR = CURTRXAM,  
@TXDTTPUR = CURTRXAM,  
@ORTOTPUR = CURTRXAM, 
@ORTAXAMT = @TAXAMNT, 
@PCTAXAMT = @TAXAMNT, 
@ORPURTAX = @TAXAMNT, 
@POSTED = POSTED 

from jcrfp100 where dex_row_id in (select dex_row_id from #retentiontemp) 

If @TAXAMNT Is Null 

set @ACTINDX = '27' 
Else 
set @ACTINDX = '28' 

INSERT INTO PM10500 (VENDORID, VCHRNMBR, DOCTYPE, BACHNUMB, TAXDTLID, BKOUTTAX, TAXAMNT, ORTAXAMT, PCTAXAMT, ORPURTAX, FRTTXAMT, ORFRTTAX, MSCTXAMT, ORMSCTAX, ACTINDX, TRXSORCE, TDTTXPUR, ORTXBPUR, TXDTTPUR, ORTOTPUR, CURRNIDX, POSTED) VALUES (@VENDORID, @VCHRNMBR, @DOCTYPE, @BACHNUMB, @TAXDTLID, '0', @TAXAMNT, @ORTAXAMT, @PCTAXAMT, @ORPURTAX, '0', '0', '0', '0', @ACTINDX, '0', @TDTTXPUR, @ORTXBPUR, @TXDTTPUR, @ORTOTPUR, '0', @POSTED) 

INSERT INTO JC10500 (VENDORID, VCHRNMBR, DOCTYPE, BACHNUMB, TAXDTLID, BKOUTTAX, TAXAMNT, ORTAXAMT, PCTAXAMT, ORPURTAX, FRTTXAMT, ORFRTTAX, MSCTXAMT, ORMSCTAX, ACTINDX, TRXSORCE, TDTTXPUR, ORTXBPUR, TXDTTPUR, ORTOTPUR, CURRNIDX, POSTED) VALUES (@VENDORID, @VCHRNMBR, @DOCTYPE, @BACHNUMB, @TAXDTLID, '0', @TAXAMNT, @ORTAXAMT, @PCTAXAMT, @ORPURTAX, '0', '0', '0', '0', @ACTINDX, '0', @TDTTXPUR, @ORTXBPUR, @TXDTTPUR, @ORTOTPUR, '0', @POSTED) 

select * from PM10500 where VCHRNMBR in (select VCHRNMBR from #retentiontemp) 
select * from JC10500 where VCHRNMBR in (select VCHRNMBR from #retentiontemp) 
+0

[SQL服務器,請選擇到現有的表]的可能的複製(http://stackoverflow.com/questions/4101739/sql-server-select-into-existing-table) –

回答

1

變量只可以存儲一次一個值,因此當您使用INSERT INTO - VALUES語句時,只會輸入一行。

嘗試INSERT INTO - SELECT改爲。像下面這樣:

IF OBJECT_ID('tempdb..#retentiontemp') IS NOT NULL 
    /* Then it exists */ 
    DROP TABLE #retentiontemp 

Select * 
Into #retentiontemp 
From  
    (SELECT VCHRNMBR,dex_row_id 
     FROM JCRFP100 
     WHERE VCHRNMBR NOT IN (SELECT VCHRNMBR FROM JC10500) 
    ) As VCHRNMBR 


INSERT INTO PM10500 (VENDORID, VCHRNMBR, DOCTYPE, BACHNUMB, TAXDTLID, BKOUTTAX, TAXAMNT, ORTAXAMT, PCTAXAMT, ORPURTAX, FRTTXAMT, ORFRTTAX, MSCTXAMT, ORMSCTAX, ACTINDX, TRXSORCE, TDTTXPUR, ORTXBPUR, TXDTTPUR, ORTOTPUR, CURRNIDX, POSTED) 
SELECT 
VENDORID, VCHNUMWK, DOCTYPE, BACHNUMB, Taxschid, '0', TAXAMNT, TAXAMNT, TAXAMNT, TAXAMNT, '0', '0', '0', '0', CASE WHEN TAXAMNT IS NULL THEN '27' ELSE '28' END, '0', CURTRXAM, CURTRXAM, CURTRXAM, CURTRXAM, '0' POSTED FROM jcrfp100 WHERE dex_row_id in (SELECT dex_row_id FROM #retentiontemp) 

INSERT INTO JC10500 (VENDORID, VCHRNMBR, DOCTYPE, BACHNUMB, TAXDTLID, BKOUTTAX, TAXAMNT, ORTAXAMT, PCTAXAMT, ORPURTAX, FRTTXAMT, ORFRTTAX, MSCTXAMT, ORMSCTAX, ACTINDX, TRXSORCE, TDTTXPUR, ORTXBPUR, TXDTTPUR, ORTOTPUR, CURRNIDX, POSTED) 
SELECT 
VENDORID, VCHNUMWK, DOCTYPE, BACHNUMB, Taxschid, '0', TAXAMNT, TAXAMNT, TAXAMNT, TAXAMNT, '0', '0', '0', '0', CASE WHEN TAXAMNT IS NULL THEN '27' ELSE '28' END, '0', CURTRXAM, CURTRXAM, CURTRXAM, CURTRXAM, '0' POSTED FROM jcrfp100 WHERE dex_row_id in (SELECT dex_row_id FROM #retentiontemp) 

select * from PM10500 where VCHRNMBR in (select VCHRNMBR from #retentiontemp) 
select * from JC10500 where VCHRNMBR in (select VCHRNMBR from #retentiontemp)