0

我是 T-SQL 的暑期实习生,我必须在各种数据库上运行 sql select 语句。我想做的是使用“如果存在”来防止发生错误,因为列表中执行此语句的某些数据库不再存在。但是,我无法弄清楚如何将其应用于我的陈述。任何帮助将不胜感激。以下是我和另一位实习生写的声明:

select distinct mg.MatterName, mg.ClientNumber, mg.MatterNumber,grp.groupName as SecurityGroup
from (select distinct mat.matterName, mat.clientNumber, mat.matterNumber, usr.GroupID
    from <db_name>.dbo.matter mat
    inner join <db_name>.dbo.usrAccount usr
    on usr.NTlogin=mat.matterCreateBy) as mg
          inner join <db_name>.dbo.usrGroup grp
          on mg.groupID=grp.groupID
order by matterName

< db_name> 是作为数据库名称的传入参数所在的位置。

4

2 回答 2

1

您可以使用sp_MSforeachdb枚举实例上的所有数据库。

这将类似于:

exec sp_MSforeachdb 'select distinct mg.MatterName, mg.ClientNumber, mg.MatterNumber,grp.groupName as SecurityGroup from (select distinct mat.matterName, mat.clientNumber, mat.matterNumber, usr.GroupID     from ?.dbo.matter mat     inner join ?.dbo.usrAccount usr     on usr.NTlogin=mat.matterCreateBy) as mg           inner join ?.dbo.usrGroup grp           on mg.groupID=grp.groupID order by matterName'

或者,您可以使用动态 sql 来制作脚本:

select 'use ' + name + ';' + char(13) + 'select distinct mg.MatterName, mg.ClientNumber, mg.MatterNumber,grp.groupName as SecurityGroup' +CHAR(13) + 'from (select distinct mat.matterName, mat.clientNumber, mat.matterNumber, usr.GroupID' + char(13) + 'from dbo.matter mat' + char(13) + 'inner join dbo.usrAccount usr on usr.NTlogin=mat.matterCreateBy) as mg' + char(13) + 'inner join dbo.usrGroup grp on mg.groupID=grp.groupID' + CHAR(13) + 'order by matterName;'
from master.sys.databases where database_id>4

如果您将输出重定向到 SSMS 中的“结果到文本”然后运行脚本,您将看到编写的脚本,然后您可以将其放入查询编辑器中执行。

于 2012-06-13T21:21:36.790 回答
0

我让它工作。我认为这有点骇人听闻,但我所做的是捕获抛出的异常并更改页面上的标签以反映数据库不存在。

 DataAccess dal = new DataAccess();
 dal.SelectedConnectionString = "WebServer08";

 String exNetName = Request.QueryString["name"];
 if (exNetName != null && !exNetName.Equals(""))
 {
     try
     {
        gvMatters.DataSource = dal.GetMatters(exNetName);
        gvMatters.DataBind();
      }
      catch (Exception ex)
      {
         noDB.Text = "This database doesn't exist.";
         gvMatters.Visible = false;
      }
 }

而且我只是按原样保留了 SQL 语句,而不是试图搞砸它

于 2012-06-14T15:40:47.817 回答