【问题标题】:T-SQL if existsT-SQL 如果存在
【发布时间】:2012-06-13 21:07:56
【问题描述】:

我是 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

是传入参数的位置,即数据库的名称。

【问题讨论】:

标签: tsql


【解决方案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 中的“结果到文本”然后运行脚本,您将看到编写的脚本,然后您可以将其放入查询编辑器中执行。

【讨论】:

  • 我认为这会很好,但是发生的事情是 IT 部门在 Intranet 站点上有一个列表,并且可以单击每个站点以查看谁访问它的日志。您还可以单击每个站点的链接以查看该站点存在哪些活动的“事项”。但是,有些站点不再使用,因此日志仍然存在,但“事项”的数据库已消失,因此当单击事项的链接时,它会出错。所以我想做的是:当点击链接并且 SQL 语句返回数据库不存在时,它会加载一个不同的页面,说数据库不再存在
  • 我建议这里的问题与应用程序没有正确处理错误有关。您是否有权重构它以调用存储过程?
  • 我有访问权限,但我不知道如何创建存储过程。这就是为什么我希望“如果存在”能够快速解决
  • 抱歉,迈克,我刚刚收到你的消息。创建存储过程就像输入CREATE PROCEDURE &lt;proc_name&gt; &lt;param_list&gt; AS BEGIN &lt;sql_statements&gt; END GO 一样简单。然后,您可以合并解决方案中提到的修复程序,如果数据库不存在,您只需返回。但是,您的解决方案做得很好 - 这是完全可以接受的,但抛出的任何异常都会报告数据库不存在,而实际上它可能不存在。可能最好将文本设置为ex.Message
【解决方案2】:

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

 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 语句,而不是试图搞砸它

【讨论】:

    猜你喜欢
    • 2011-11-11
    • 2021-02-19
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    相关资源
    最近更新 更多