2012-10-24 68 views
2

所有...基於我最近在這裏發佈的另一個問題,我構建了這個存儲過程,但是當執行時,我收到標題中的錯誤。你可以看到,我試圖刪除任何別名,但它並不重要。不知道如何使用PRINT來查看這個問題。當然,獨立的SELECT聲明是獨立運作的。Msg 102,Level 15,State 1,Line 24在'。'附近有錯誤的語法。

在出現錯誤後,我甚至可以從臨時表中提取結果。那麼這是腳本還是結果中的問題?感謝您的幫助。我也只使用WHERE語句來限制測試結果。

ALTER PROC ap_vhdr_test AS 
SET NOCOUNT ON 
IF OBJECT_ID('temp.dbo.#ap_vend_det') is NOT NULL 
DROP TABLE #ap_vend_det; 

CREATE TABLE #ap_vend_det   
(db_name varchar(32) 
, vendor_name varchar(40) 
, vendor_code varchar(12) 
, voucher_no varchar(16) 
, invoice_num varchar(16) 
, inv_date varchar(16) 
, due_date varchar(16) 
, apply_date varchar(16) 
, total float 
, line_desc varchar(40) 
, company_id smallint 
, gl_num varchar(32) 
, acct_site varchar(32) 
, sort_code varchar(32) 
, nat_gl varchar(32) 
, gl_desc varchar(40) 
, category nvarchar(510) 
, sub_category nvarchar(510) 
, po_num varchar(16) 
, vendor_class varchar(8) 
) 
INSERT INTO #ap_vend_det 
EXEC sp_MSforeachdb N'IF ''?'' NOT IN (''model'',''tempdb'',''master'',''msdb'') 
BEGIN SELECT DISTINCT db_name = ''?'' 
, amaster.addr1 --as vendor_name 
, amaster.vendor_code --as vendor_code 
, apdet.trx_ctrl_num --as voucher_no 
, aphdr.doc_ctrl_num --as invoice_num 
, CONVERT(varchar(16),dateadd(dd,(aphdr.date_doc - 639906),''1/1/1753''),101) --as inv_date 
, CONVERT(varchar(16),dateadd(dd,(aphdr.date_due - 639906),''1/1/1753''),101) --as due_date 
, CONVERT(varchar(16),dateadd(dd,(aphdr.date_applied - 639906),''1/1/1753''),101) --as apply_date 
, aphdr.amt_net --as total 
, aphdr.doc_desc --as line_desc 
, gldet.company_id --as company_id 
, gldet.account_code --as gl_num 
, gldet.seg2_code --as acct_site 
, gldet.seg3_code --as sort_code 
, gldet.seg1_code --as nat_gl 
, gldet.description --as gl_desc 
, ap_coa.group_header --as category 
, ap_coa.group_label --as sub_category 
, apdet.po_ctrl_num --as po_num 
, apvend.vend_class_code --as vendor_class 
FROM ?.dbo.amaster --amaster 
JOIN ?.dbo.aphdr --aphdr      --** 
    ON amaster.vendor_code = aphdr.vendor_code 
    AND amaster.pay_to_code = aphdr.pay_to_code 
JOIN ?.dbo.apdet --apdet 
    ON aphdr.trx_ctrl_num = apdet.trx_ctrl_num 
JOIN ?.dbo.gldet --gldet 
    ON aphdr.journal_ctrl_num = gldet.journal_ctrl_num 
JOIN ?.dbo.glt --glt 
    ON gldet.journal_ctrl_num = glt.journal_ctrl_num 
JOIN ?.dbo.apvend --apvend 
    ON amaster.vendor_code = apvend.vendor_code 
JOIN reps.dbo.ap_coa --ap_coa 
    ON gldet.seg1_code = ap_coa.acct_code 
WHERE aphdr.date_applied >= ''734785''    
END'; 

SELECT * FROM #ap_vend_det; 
+0

停止,停止,停止使用sp_MSforeachdb。由於某種原因,它不受支持和無證。它不僅處理具有特殊字符的數據庫,有時它只是完全跳過數據庫。請參閱http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx和http://www.mssqltips.com/ sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/ –

回答

2

如果您的數據庫名稱中包含空格或其他字符,則會失敗。您需要將它們放在方括號中,例如

FROM [?].dbo.amaster --amaster 

不僅如此,因爲您使用3個部分名稱,所以還需要在FROM子句中別名表。

FROM [?].dbo.amaster amaster 
JOIN [?].dbo.aphdr aphdr      --** 
    ON amaster.vendor_code = aphdr.vendor_code 
    AND amaster.pay_to_code = aphdr.pay_to_code 
JOIN [?].dbo.apdet apdet 
    ON aphdr.trx_ctrl_num = apdet.trx_ctrl_num 
JOIN [?].dbo.gldet gldet 
    ON aphdr.journal_ctrl_num = gldet.journal_ctrl_num 
JOIN [?].dbo.glt glt 
    ON gldet.journal_ctrl_num = glt.journal_ctrl_num 
JOIN [?].dbo.apvend apvend 
    ON amaster.vendor_code = apvend.vendor_code 
JOIN reps.dbo.ap_coa ap_coa 
    ON gldet.seg1_code = ap_coa.acct_code 
WHERE aphdr.date_applied >= ''734785''  
+0

謝謝。使用的唯一其他字符是數據庫名稱中的下劃線。我附上了?在括號[?]中,讀取了別名和...(等待結果和戲劇性影響) – PuroRock

+0

它工作。你是男人。 – PuroRock

相關問題