Sql 在预期条件的上下文中指定的非布尔类型的表达式,靠近。。。桌子

Sql 在预期条件的上下文中指定的非布尔类型的表达式,靠近。。。桌子,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我试图做的是基于company_id@company_id,它有一个对应的数据库名@db_name,试图根据这些变量提取数据。我有30多个表,需要根据选择的公司ID查看数据 i、 e.数据库执行日记账分录;1'1' ALTER PROC esh_journal_entries_by_dbase (@company_id varchar(2)) AS ------------------------------------------------------- BEGIN CREATE T

我试图做的是基于company_id@company_id,它有一个对应的数据库名@db_name,试图根据这些变量提取数据。我有30多个表,需要根据选择的公司ID查看数据

i、 e.数据库执行日记账分录;1'1'

    ALTER PROC esh_journal_entries_by_dbase
(@company_id varchar(2))
AS
-------------------------------------------------------
BEGIN
CREATE TABLE ##journal_dbase            
(company_id varchar(8)
, journal_description varchar(255)      
, journal_type varchar(8)
, date_entered varchar(10)
, date_applied varchar(10)
, date_posted varchar(10)
, hold_flag varchar(8)
, reversing_flag varchar(9)
, intercompany_flag varchar(8)
, domain_username varchar(255)
, posted_flag varchar(8)
, multi_currency_flag varchar(8)
, home_credit decimal(20,2)
, home_debit decimal(20,2))
;
-------------------------------------------------------
DECLARE --@company_id varchar(8)
        @db_name varchar(32)
        , @sql varchar(8000)
        , @drop_table varchar(200)
        ;
-------------------------------------------------------
SET @db_name = 'select db_name from contrl.dbo.company where company_id = 1' --@company_id';

-------------------------------------------------------
SET @sql =
'INSERT INTO ##journal_dbase
   SELECT '+@company_id+'  
   , trx.journal_description as [Description]
   , trx.journal_type as [Journal Code]
   , convert(varchar(12),dateadd(dd,(trx.date_entered - 639906),''1/1/1753''),101) as [Entry Date]
   , convert(varchar(12),dateadd(dd,(trx.date_applied - 639906),''1/1/1753''),101) as [Apply Date]
   , convert(varchar(12),dateadd(dd,(trx.date_posted - 639906),''1/1/1753''),101) as [Post Date]
   --, trx.date_entered as [Entry Date]
   --, trx.date_applied as [Apply Date]
   --, trx.date_posted as [Post Date]
   , [Hold] = CASE trx.hold_flag  
        WHEN 0 THEN ''No''  
        WHEN 1 THEN ''Yes'' 
        END --as hold
   , [Trans Flag] = CASE trx.reversing_flag  
        WHEN 0 THEN ''Standard'' 
        WHEN 1 THEN ''Reversing'' 
        END --as trans_flag
   , [InterCo] = CASE trx.intercompany_flag  
        WHEN 0 THEN ''No''  
        WHEN 1 THEN ''Yes''  
        END 
   , CASE WHEN e.domain_username NOT LIKE ''%\%''
        THEN e.domain_username
        ELSE SUBSTRING(e.domain_username,5,20)  --SELECT DISTINCT domain_username FROM ECTRL..smusers
        END AS [User Name]
   , [Posted Flag] = CASE trx.posted_flag  
        WHEN 0 THEN ''No''  
        WHEN 1 THEN ''Yes''  
        END 
   , trx.source_company_code as [Org]
   --, SUM(bal.home_credit) as [Total Home Credit] 
   --, SUM(bal.home_debit) as [Total Home Debit]    
   , bal.home_credit as [Total Home Credit]
   , bal.home_debit as [Total Home Debit]
FROM '+@db_name+'.dbo.trx trx                       
LEFT OUTER JOIN '+@db_name+'.dbo.trxdet trxdet
    ON trx.journal_ctrl_num = trxdet.journal_ctrl_num
LEFT OUTER JOIN '+@db_name+'.dbo.bal bal
    ON trxdet.account_code = bal.account_code
--LEFT OUTER JOIN con.dbo.users e
--  ON trx.user_id = e.user_id
--WHERE trx.date_posted > 0
--  AND trx.date_applied >= ''734503''
--  AND trx.date_applied <= ''734710'''
    ;
-------------------------------------------------------
SET @company_id = 'select company_id from ewcomp' --where db_name in (@db_name)
-------------------------------------------------------
EXEC (@sql);
-------------------------------------------------------
SELECT * FROM ##journal_dbase;

这将返回在预期条件的上下文中指定的非布尔类型的表达式,靠近bal、trx和trxdet

将SQL查询放入公司和数据库名称的变量中。我认为您需要查询表中的值:

SET @company = (SELECT company FROM contrl.dbo.company)
SET @db_name = (SELECT db_name FROM contrl.dbo.company WHERE company = @company)
或者简单地说:

SELECT @company = company FROM contrl.dbo.company
SELECT @db_name = db_name FROM contrl.dbo.company WHERE company = @company
编辑: 使用更新的代码;更改此项:

SET @db_name = 'select db_name from contrl.dbo.company where company_id = 1'

或者使用@CompnayId变量:

SELECT @db_name = db_name from contrl.dbo.company where company_id = cast(@CompanyId as int)

我的问题是,当我需要将其加入sys.databases时,我试图在内部引用company表以获取db_名称。我删除了设置的@company\u id,并将以下内容用作@db\u名称。它起作用了

SELECT @db_name = name 
FROM sys.databases 
    JOIN contrl.dbo.company 
    ON sys.databases.name = contrl.dbo.company.db_name 
WHERE contrl.dbo.company.company_id in (@company_id)

请了解、可执行查询和之间的区别。@PuroRock有几个问题@db_名称是通过动态sql设置的,但尚未执行。然后尝试在完整查询中使用它。所以它不知道这个值是多少。@Guffa我不认为你提供了一个实际的答案。它可以被归类为一个好的陷阱,但我只是不确定它是否是问题的答案。@Guffa没有进行长时间的讨论,我相信你所做的是试图治疗症状,而不是问题。话虽如此,我也没有投反对票。@PuroRock为什么要选择进入公司id,而这是一个已经传递到过程中的参数?这并不是说它影响了代码本身的任何东西,但我觉得它很奇怪。我还试图理解为什么在此上下文中使用临时表?这仅在公司表上只有一行时有效。如果表中有多行符合条件,则这将不起作用。你建议如何解决这个问题?@Lamak&bluefeet:你完全没有抓住要点。当然,这只在表中只有一条记录的情况下有效,但是如果变量包含SQL查询而不是实际数据,则使用它创建另一个查询根本不起作用。为什么要进行向下投票?如果你不解释你认为错误的地方,就无法改善答案。为什么要投否决票?如果你不解释你认为错误的地方,那就无法改善答案。
SELECT @db_name = name 
FROM sys.databases 
    JOIN contrl.dbo.company 
    ON sys.databases.name = contrl.dbo.company.db_name 
WHERE contrl.dbo.company.company_id in (@company_id)