我是T-SQL的新实习生,我必须在各种数据库上运行sql select语句。我想要做的是使用'if exists'来防止错误发生,因为列表上执行此语句的某些数据库不再存在。但是,我无法弄清楚如何将它应用到我的陈述中。任何帮助将不胜感激。以下是我的判断,另一位实习生写道:
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
&lt; DB_NAME&GT;是传入的参数,即数据库名称的位置。
答案 0 :(得分: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中的“结果到文本”然后运行脚本,您将看到一个脚本,然后您可以将其放入查询编辑器中执行。
答案 1 :(得分:0)
我得到了它的工作。我认为这有点hackey但我所做的是捕获抛出的异常,只是更改页面上的标签以反映数据库不存在。
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语句而不是试图搞砸它