无法使用database_id连接对象(表)名称

时间:2015-01-19 07:02:58

标签: sql sql-server sql-server-2008 tsql

我找不到使用database_id加入对象的方法。

我正在尝试编写一个审计查询,它通过接受数据库名称作为参数来扫描表。

我想避免动态查询有可能吗?

喜欢

SELECT *
FROM   information_schema.tables a
       JOIN sys.tables b
         ON a.datbase_id = b.database_id
            AND b.database_name = 'testdb' 

2 个答案:

答案 0 :(得分:0)

放手一搏。

select * 
from 
    INFORMATION_SCHEMA.TABLES it
    inner join sys.tables st
        on st.name = it.table_name
where it.TABLE_CATALOG = 'testdb' 

答案 1 :(得分:0)

首先,database_id中没有information_schema.tables这样的列。其次,有一个名为sp_msForEachDb的未记录的存储过程,它逐个遍历所有数据库并运行您想要的脚本,您需要将其作为字符串输入传递给它。

在您的情况下,您似乎希望将information_schema.tables加入sys.tables并列出testDB数据库的表。请尝试下面的脚本:

--Build a temp table to store the info
select * into  #a 
from INFORMATION_SCHEMA.TABLES it join sys.tables st 
on st.name COLLATE SQL_Latin1_General_CP1_CI_AS= it.table_name COLLATE SQL_Latin1_General_CP1_CI_AS 
where 1=0

insert into #a --This script runs for each database and populates the info into #a
EXECUTE master.sys.sp_MSforeachdb 
'select * from INFORMATION_SCHEMA.TABLES it join [?].sys.tables st 
on st.name COLLATE SQL_Latin1_General_CP1_CI_AS= it.table_name COLLATE SQL_Latin1_General_CP1_CI_AS 
where it.TABLE_CATALOG = ''testdb'''

select * from #a