2

所有...基于我最近在这里发布的另一个问题,我构建了这个存储过程,但是在执行时,我收到标题中的错误。

如您所见,我尝试删除任何别名,但这没关系。也不知道如何使用 PRINT 来查看这个问题。当然,孤立的SELECT陈述是独立的。

出现错误后,我什至可以从我的临时表中提取结果。那么这个脚本或结果有问题吗?感谢您的帮助。我也只使用了 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;
4

1 回答 1

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''     
于 2012-10-24T20:31:21.940 回答