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 の "Results to Text" にリダイレクトしてからスクリプトを実行すると、クエリ エディターに入力して実行できるスクリプトが記述されていることがわかります。

于 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 に答える