⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 objectsbrowser.pas

📁 mssql查询分析器
💻 PAS
📖 第 1 页 / 共 3 页
字号:

    Rst.MoveNext;
  end;

  Node.Expand(False);
end;

procedure TObjectsBrowserPanel.FillDepends(Node: TTreeNode;
  DBName: string; ObjID: Integer);
const
  sql1 =
'select distinct owner = user_name(o.uid), o.name, o.type, d.id ' +
'from [%s].dbo.sysdepends d, [%s].dbo.sysobjects o ' +
'where d.depid = %d and d.id = o.id ';

  sql2 =
'select distinct owner = user_name(o.uid), o.name, o.type, o.id ' +
'from [%s].dbo.sysobjects o, [%s].dbo.sysdepends d ' +
'where d.id = %d and o.id = d.depid';

var
  Rst: _Recordset;
  dNode: TTreeNode;
  dbo, dname: string;
begin
  ExecuteSql(Format('use [%s]', [DBName]));

  // 引用自身的其它对象
  Rst := ExecuteRst(Format(sql1, [DBName, DBName, ObjID]));
  while not Rst.EOF do
  begin
    dname := Rst.Fields.Item['name'].Value;
    dbo := Rst.Fields.Item['owner'].Value;

    dNode := FTreeView.Items.AddChild(Node, dbo + '.' + dname);
    dNode.ImageIndex := 8;
    dNode.SelectedIndex := 8;

    Rst.MoveNext;
  end;

  // 被自身引用的其它对象
  Rst := ExecuteRst(Format(sql2, [DBName, DBName, ObjID]));
  while not Rst.EOF do
  begin
    dname := Rst.Fields.Item['name'].Value;
    dbo := Rst.Fields.Item['owner'].Value;

    dNode := FTreeView.Items.AddChild(Node, dbo + '.' + dname);
    dNode.ImageIndex := 9;
    dNode.SelectedIndex := 9;

    Rst.MoveNext;
  end;

  if Node.Count = 0 then Node.HasChildren := False;
{
select distinct owner = user_name(o.uid), o.name, o.type, d.id
from [pubs].dbo.sysdepends d, [pubs].dbo.sysobjects o
where d.depid = 213575799 and d.id = o.id

select distinct owner = user_name(o.uid), o.name, o.type, o.id
from [pubs].dbo.sysobjects o, [pubs].dbo.sysdepends d
where d.id = 213575799 and o.id = d.depid
}
end;

procedure TObjectsBrowserPanel.FillFunctions(Node: TTreeNode;
  dbName: string);
  
  procedure AddFuncItemNode(ParentNode: TTreeNode; Title: string;
                                Data: TFuncItemInfo);
  var
    Node: TTreeNode;
  begin
    Node := FTreeView.Items.AddChildObject(ParentNode, Title, Pointer(Data));
    Node.ImageIndex := 2;
    Node.SelectedIndex := 3;
    Node.HasChildren := True;
  end;

const
  sql =
'select id, owner = user_name(uid), name, type ' +
'from [%s].dbo.sysobjects ' +
'where type = N''TF'' or type = N''IF'' or type = N''FN'' order by name';
var
  Rst: _Recordset;
  dbo, fnname: string;
  fnID: Integer;
  fnNode: TTreeNode;
begin
  ExecuteSql(Format('use [%s]', [dbName]));
  Rst := ExecuteRst(Format(sql, [dbName]));
  while not Rst.EOF do
  begin
    dbo := String(Rst.Fields.Item['owner'].Value);
    fnname := String(Rst.Fields.Item['name'].Value);
    fnID := Integer(Rst.Fields.Item['id'].Value);

    fnNode := FTreeView.Items.AddChild(Node, dbo + '.' + fnname);
    fnNode.ImageIndex := 14;
    fnNode.SelectedIndex := 14;
    fnNode.Data := Pointer(TFuncNode.Create);

    AddFuncItemNode(fnNode, '参数',
        TFuncItemInfo.Create(dbName, dbo, fnname, fnID, ftParameter));
    AddFuncItemNode(fnNode, '相关性',
        TFuncItemInfo.Create(dbName, dbo, fnname, fnID, ftDepend));

    Rst.MoveNext;
  end;
  if Node.Count = 0 then Node.HasChildren := False;
end;

procedure TObjectsBrowserPanel.FillSProcParams(Node: TTreeNode;
  dbName, dbo, spname: string);
const
  sql =
'exec sp_sproc_columns N%s, N%s, N%s, NULL, @ODBCVer = 3';
var
  Rst: _Recordset;
  column, typename: string;
  coltype: Integer;
  parNode: TTreeNode;

  function GetParamDisplayText: string;
  var
    s: string;
  begin
    Result := column + '(' + typename + ', ';
    case coltype of
      1: s := '输入';
      2: s := '输入/输出';
      3, 5: s := '返回值';
      4: s := '输出';
      else s := '未知';
    end;
    Result := Result + s + ')';
  end;
begin
  ExecuteSql(Format('use [%s]', [dbName]));
  Rst := ExecuteRst(Format(sql,
              [QuotedStr(spname), QuotedStr(dbo), QuotedStr(dbName)]));
  while not Rst.EOF do
  begin
    column := Rst.Fields['COLUMN_NAME'].Value;
    typename := Rst.Fields['TYPE_NAME'].Value;
    coltype := Rst.Fields['COLUMN_TYPE'].Value;

    parNode := FTreeView.Items.AddChild(Node, GetParamDisplayText);
    parNode.ImageIndex := 13;
    parNode.SelectedIndex := 13;

    Rst.MoveNext;
  end;
  if Node.Count = 0 then Node.HasChildren := False;
end;

procedure TObjectsBrowserPanel.FillStoredProcs(Node: TTreeNode;
  dbName: string);

  procedure AddSPItemNode(ParentNode: TTreeNode; Title: string;
                                Data: TSPItemInfo);
  var
    Node: TTreeNode;
  begin
    Node := FTreeView.Items.AddChildObject(ParentNode, Title, Pointer(Data));
    Node.ImageIndex := 2;
    Node.SelectedIndex := 3;
    Node.HasChildren := True;
  end;

const
  sql =
'select id, owner = user_name(uid), name, status ' +
'from [%s].dbo.sysobjects ' +
'where type = N''P'' order by name';
var
  Rst: _Recordset;
  dbo, spname: string;
  spID: Integer;
  spNode: TTreeNode;
begin
  ExecuteSql(Format('use [%s]', [dbName]));
  Rst := ExecuteRst(Format(sql, [dbName]));
  while not Rst.EOF do
  begin
    dbo := String(Rst.Fields.Item['owner'].Value);
    spname := String(Rst.Fields.Item['name'].Value);
    spID := Integer(Rst.Fields.Item['id'].Value);

    spNode := FTreeView.Items.AddChild(Node, dbo + '.' + spname);
    spNode.ImageIndex := 12;
    spNode.SelectedIndex := 12;
    spNode.Data := Pointer(TSPNode.Create);

    AddSPItemNode(spNode, '参数',
        TSPItemInfo.Create(dbName, dbo, spname, spID, stParameter));
    AddSPItemNode(spNode, '相关性',
        TSPItemInfo.Create(dbName, dbo, spname, spID, stDepend));

    Rst.MoveNext;
  end;
  if Node.Count = 0 then Node.HasChildren := False;
end;

procedure TObjectsBrowserPanel.FillSysTables(Node: TTreeNode;
  dbName: string);

  procedure AddTableItemNode(ParentNode: TTreeNode; Title: string;
                                Data: TTableItemInfo);
  var
    Node: TTreeNode;
  begin
    Node := FTreeView.Items.AddChildObject(ParentNode, Title, Pointer(Data));
    Node.ImageIndex := 2;
    Node.SelectedIndex := 3;
    Node.HasChildren := True;
  end;

const
  sql = 'select id, owner = user_name(uid), name, status ' +
        'from [%s].dbo.sysobjects where type = N''S'' order by name';
var
  Rst: _Recordset;
  tabNode: TTreeNode;
  dbo, table: string;
  tabID: Integer;
begin
  ExecuteSql(Format('use [%s]', [dbName]));
  Rst := ExecuteRst(Format(sql, [dbName]));
  while not Rst.EOF do
  begin
    dbo := String(Rst.Fields.Item['owner'].Value);
    table := String(Rst.Fields.Item['name'].Value);
    tabID := Integer(Rst.Fields.Item['id'].Value);

    tabNode := FTreeView.Items.AddChild(Node, dbo + '.' + table);
    tabNode.ImageIndex := 4;
    tabNode.SelectedIndex := 4;
    tabNode.Data := Pointer(TTableNode.Create);

    AddTableItemNode(tabNode, '列', TTableItemInfo.Create(dbName, tabID, ttColumn));
    AddTableItemNode(tabNode, '索引', TTableItemInfo.Create(dbName, tabID, ttIndex));
    AddTableItemNode(tabNode, '约束', TTableItemInfo.Create(dbName, tabID, ttContraint));
    AddTableItemNode(tabNode, '相关性', TTableItemInfo.Create(dbName, tabID, ttDepend));
    AddTableItemNode(tabNode, '触发器', TTableItemInfo.Create(dbName, tabID, ttTrigger));

    Rst.MoveNext;
  end;
  if Node.Count = 0 then Node.HasChildren := False;
end;

procedure TObjectsBrowserPanel.FillTableColumns(Node: TTreeNode;
  Data: TObject);
const
  sql =
'select C.name, C.type, C.xtype, C.xusertype, ' +
'    C.length, C.prec, C.scale, C.isnullable, ' +
'    typename = T.name ' +
'from [%s].dbo.syscolumns C, [%s].dbo.systypes T ' +
'where C.xusertype = T.xusertype ' +
'    and id = %d order by C.colorder ';
var
  info: TTableItemInfo;
  Rst: _Recordset;
  cNode: TTreeNode;
  title, cname, typename: string;
  prec: SmallInt;
  scale: ShortInt;
  length: Integer;
  nullable: Boolean;
begin
  info := Data as TTableItemInfo;

  ExecuteSql(Format('use [%s]', [info.FDBName]));
  Rst := ExecuteRst(Format(sql, [info.FDBName, info.FDBName, info.FTableID]));
  while not Rst.EOF do
  begin
    cname := Rst.Fields.Item['name'].Value;
    typename := Rst.Fields.Item['typename'].Value;
    prec := Rst.Fields.Item['prec'].Value;
    scale := Rst.Fields.Item['scale'].Value;
    length := Rst.Fields.Item['length'].Value;
    nullable := Rst.Fields.Item['isnullable'].Value;

    title := GetColumnDescription(cname, typename, length, prec, scale, nullable);

    cNode := FTreeView.Items.AddChild(Node, title);
    cNode.ImageIndex := 5;
    cNode.SelectedIndex := 5;
    
    Rst.MoveNext;
  end;

  if Node.Count = 0 then Node.HasChildren := False;
{
USE [LerpSys]
go
select name, type, xtype, xusertype, length, prec, scale, isnullable from [LerpSys].dbo.syscolumns where id = 1509580416 order by colorder
go
select xtype, xusertype, type, name from [LerpSys].dbo.systypes order by xtype
go
select xtype, xusertype, type, name from [LerpSys].dbo.systypes where xusertype > 256 order by xtype
go
}
end;

procedure TObjectsBrowserPanel.FillTableContraints(Node: TTreeNode;
  Data: TObject);
const
  sql =
'select id, owner = user_name(uid), name, type, info, xtype ' +
'from [%s].dbo.sysobjects ' +
'where parent_obj = %d ' +
'  and (type = N''C'' or type = N''D'' or type = N''F'' or type = N''K'')';
var
  info: TTableItemInfo;
  Rst: _Recordset;
  cNode: TTreeNode;
  cname, dbo: string;
begin
  info := Data as TTableItemInfo;

  ExecuteSql(Format('use [%s]', [info.FDBName]));
  Rst := ExecuteRst(Format(sql, [info.FDBName, info.FTableID]));
  while not Rst.EOF do
  begin
    dbo := Rst.Fields.Item['owner'].Value;
    cname := Rst.Fields.Item['name'].Value;
    cNode := FTreeView.Items.AddChild(Node, dbo + '.' + cname);
    cNode.ImageIndex := 7;
    cNode.SelectedIndex := 7;
    
    Rst.MoveNext;
  end;

  if Node.Count = 0 then Node.HasChildren := False;
end;

procedure TObjectsBrowserPanel.FillTableIndexes(Node: TTreeNode;
  Data: TObject);
const
  sql =
'select I.name, I.status from [%s].dbo.sysindexes I ' +
'where I.id = %d and I.indid > 0 and I.indid < 255 ' +
'  and INDEXPROPERTY(I.id, I.name, N''IsStatistics'') = 0 ' +
'  and INDEXPROPERTY(I.id, I.name, N''IsHypothetical'') = 0 ' +
'  and I.name not in ' +
'    ( ' +
'    select O.name from sysobjects O ' +
'    where O.parent_obj = I.id and OBJECTPROPERTY(O.id, N''isConstraint'') = 1 ' +
'    )';

var
  info: TTableItemInfo;
  Rst: _Recordset;
  idxNode: TTreeNode;
  idxname: string;
begin
  info := Data as TTableItemInfo;

  ExecuteSql(Format('use [%s]', [info.FDBName]));
  Rst := ExecuteRst(Format(sql, [info.FDBName, info.FTableID]));
  while not Rst.EOF do
  begin
    idxname := Rst.Fields.Item['name'].Value;
    idxNode := FTreeView.Items.AddChild(Node, idxname);
    idxNode.SelectedIndex := 6;
    idxNode.ImageIndex := 6;
    
    Rst.MoveNext;
  end;

  if Node.Count = 0 then Node.HasChildren := False;
end;

procedure TObjectsBrowserPanel.FillTriggers(Node: TTreeNode;
  DBName: string; ObjID: Integer);
const
  sql =
'select name, owner = user_name(uid) ' +
'from [%s].dbo.sysobjects ' +
'where type = N''TR'' and parent_obj = %d';

var
  Rst: _Recordset;
  trgNode: TTreeNode;
  dbo, trigger: string;
begin
  ExecuteSql(Format('use [%s]', [DBName]));
  Rst := ExecuteRst(Format(sql, [DBName, ObjID]));
  while not Rst.EOF do
  begin
    dbo := Rst.Fields.Item['owner'].Value;
    trigger := Rst.Fields.Item['name'].Value;

    trgNode := FTreeView.Items.AddChild(Node, dbo + '.' + trigger);
    trgNode.ImageIndex := 10;
    trgNode.SelectedIndex := 10;
    
    Rst.MoveNext;
  end;

  if Node.Count = 0 then Node.HasChildren := False;
{
select name, owner = user_name(uid)
from [pubs].dbo.sysobjects
where type = N'TR' and parent_obj = 213575799
}
end;

procedure TObjectsBrowserPanel.FillUserTables(Node: TTreeNode;
  dbName: string);

  procedure AddTableItemNode(ParentNode: TTreeNode; Title: string;
                                Data: TTableItemInfo);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -