【问题标题】:sql to find database of a table mssqlsql查找表mssql的数据库
【发布时间】:2019-04-18 10:59:07
【问题描述】:

我正在从事一个具有多个上下文的项目,因为数据是从不同的数据库中提取的。

我们大约有数百个数据库,1个数据库也有数百个表,所以要翻遍很多数据库才能找到一个表。

我只有通过这样的列名从特定数据库中查找表名的代码:

SELECT      c.name  AS 'ColumnName'
            ,t.name AS 'TableName'
FROM        sys.columns c
JOIN        sys.tables  t   ON c.object_id = t.object_id
WHERE       c.name LIKE '%mycolumn%'
ORDER BY    TableName
            ,ColumnName;

但有时我已经知道表名但不知道它属于哪个数据库。谁能指出正确的代码?

更新:

我的意思是说数据库。为了更清楚的解释,这里是我们的连接字符串,你可以看到我刚刚添加了几个数据库。

但是,它可以根据我们在代码中需要的数据而增长。我需要将用作我的上下文的数据库名称(我正在使用 dbscopecontext)以及能够像这样查询

select * from [MyDatabase].[dbo].[MyTable]

因为像下面这样从查询板中选择会出错。

select * from [dbo].[MyTable] 


    <add name="EContext" connectionString="server; Database=E;  providerName="System.Data.SqlClient" />
    <add name="MContext" connectionString="server; Database=M;  providerName="System.Data.SqlClient" />
    <add name="AContext" connectionString="server; Database=A;  providerName="System.Data.SqlClient" />
    <add name="BaContext" connectionString="server; Database=B;  providerName="System.Data.SqlClient" />
    <add name="WConntextntext" connectionString="server; Database=W;  providerName="System.Data.SqlClient" />
    <add name="WpContext" connectionString="server; Database=Wp;  providerName="System.Data.SqlClient" />
    <add name="Maontext" connectionString="server; Database=MA;  providerName="System.Data.SqlClient" />
    <add name="BlsContext" connectionString="server; Database=Bls;  providerName="System.Data.SqlClient" />
    <add name="BiContext" connectionString="server; Database=Bi;  providerName="System.Data.SqlClient" />
</connectionStrings>      

提前致谢

【问题讨论】:

  • “数据源”是什么意思?
  • 数据源通常在应用程序级别设置。如果您想知道某物正在使用的数据源,为什么不查看应用程序并找出它正在使用的连接字符串呢?试图在任意数量的数据库中按名称查找可能位于任意数量的服务器上的对象是错误的方法。
  • 与您运行引用的 sql 语句时使用的数据源相同?
  • 对不起,我的意思是说数据库不是数据源。我更新了我的问题。谢谢
  • 您发布的连接字符串列表 - 它是做什么用的?实体框架?要查找表,您不能在生成的类中进行全局搜索吗?

标签: sql-server information-schema sysobjects


【解决方案1】:

尝试此查询并根据您的需要进行修改。您只需在查询中传递列名,这将列出所有表和数据库名称。

DECLARE @SysQuery NVARCHAR(MAX)
DECLARE @columnName NVARCHAR(100) = 'EmailID'
SELECT
    @SysQuery = isnull(@SysQuery+N' UNION ALL ',N'')+
'
SELECT [Database] = convert(sysname,'''+a.name+
'''), [Table] = a.name collate SQL_Latin1_General_CP1_CI_AS from '+quotename(a.name)+'.sys.tables a 
INNER JOIN' +quotename(a.name)+'.sys.columns c ON  c.OBJECT_ID = a.OBJECT_ID AND c.name like ''%'+@columnName+'%'''
FROM
    sys.databases a
PRINT @SysQuery

EXEC ( @SysQuery+ ' ORDER by 1,2' )

【讨论】:

  • Msg 945, Level 14, State 2, Line 2 Database 'WJ..' 由于文件不可访问或内存或磁盘空间不足而无法打开。我使用“Master”运行它
  • 联系您的数据库管理员,因为这是系统级问题而不是代码级问题。
【解决方案2】:

问题: Msg 945, Level 14, State 2, Line 2 Database 'WJ..' 由于文件不可访问或内存或磁盘空间不足而无法打开。我使用“Master”运行它

修复/解决方案/解决方法:

1) 如果可能,通过从硬盘中删除不必要的文件或添加更大尺寸的新硬盘来添加更多硬盘空间。

2) 检查数据库是否设置为 Autogrow on。

3) 检查试图访问数据库的账号是否有足够的权限进行操作。

4) 确保.mdf.ldf 文件未在操作系统文件系统级别上标记为只读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多