Имя: Пароль:
IT
Админ
Запрос SQL
, ,
0 ученик_0117
 
17.05.12
10:46
День добрый!Сразу к делу:существует бд,клиент уплавления IB expert, около 800 таблиц.Задача проверить  таблицы на наличие данных(т.е открыть каждую табличку ручками и посмотреть есть данные или нет) можно этот  процесс автоматизировать?
1 Господин ПЖ
 
17.05.12
10:47
разрешаю накорябать скрипт
2 Азат
 
17.05.12
10:48
не возражаю, согласовано
3 ученик_0117
 
17.05.12
10:50
(1)каким образом?
(2)каким образом?
4 Кроха
 
17.05.12
10:52
transact sql Тебе в помощь
5 Ёпрст
 
17.05.12
10:53
(3) скриптом обойти все таблички и посмотреть select count() в них
6 ученик_0117
 
17.05.12
10:54
как я  понимаю  если знаешь то ничего  сложного?
7 badboychik
 
17.05.12
10:58
(4) это не MS SQL Server. IB Expert вроде как работает с Firebird
8 badboychik
 
17.05.12
11:00
а в фаерберде есть системная таблица с именами всех обычных таблиц. Можно написать скрипт который выберет их имена и в  цикле обойдет и посчитает во всех Count()
9 ученик_0117
 
17.05.12
11:00
(7) я  очень плохо  разбираюсь с этим...тут просто ситуация очень итересная у меня сложилась.
10 ЧеловекДуши
 
17.05.12
11:00
(7) Вот сайт www.google.ru он многое знает :)
11 ЧеловекДуши
 
17.05.12
11:01
(9) Что значит я не я, а деньги мои.
Если хочешь ЗП, то работай, учись, познавай мир ИТ :)
12 ученик_0117
 
17.05.12
11:01
(10) уже там
13 ученик_0117
 
17.05.12
11:02
(11) вот  познаю..."молодым везде  дорогу"
14 badboychik
 
17.05.12
11:03
вроде бы есть какой то пункт во многих программах для СУБД - вывести объем таблиц в МБ и строках. Потыкай и обрящешь
15 ЧеловекДуши
 
17.05.12
11:03
(12)Ты пойми, если ты из 800 таблиц не вкурсе для чего они, то веся твоя автоматизация сведется к одному: "Получить список таблиц с данными"

И все, по большей части ты даже не поймешь, что чем является, если автор БД не называл таблицы по умному, но я бы ожидал увидеть там типо: "Табл00002" и т.д.
16 ЧеловекДуши
 
17.05.12
11:04
+ Лучше начни с той программой, которая работала с этой БД.
17 ЧеловекДуши
 
17.05.12
11:07
+ Если ты под IB expert - понимаешь Интер Байзес, то там в одном файле может содержаться несколько БД. :)
18 ученик_0117
 
17.05.12
11:09
бд строил не я...лучше не пытатся написать скрипт?ручками открывать каждую табличку,щелкать по "данным" если поля не  пусты то "+",если пусто "-".
19 badboychik
 
17.05.12
11:09
Если человек не знает какая у него СУБД, вряд ли он напишет скрипт под нее
20 ученик_0117
 
17.05.12
11:28
а может  есть какой  шаблон для  данной операции?
21 Кроха
 
17.05.12
11:29
тут посмотри, мож найдешь что

http://www.sql.ru/forum/actualtopics.aspx?bid=2
22 ученик_0117
 
17.05.12
12:49
спасибо....всем!!!!
23 Ненавижу 1С
 
гуру
17.05.12
12:55
список всех таблиц

SELECT rdb$relation_name
 FROM rdb$relations
WHERE rdb$view_blr IS NULL
  AND rdb$system_flag <> 1
24 ЧеловекДуши
 
17.05.12
12:59
(23)А как получить список все заполненных таблиц?
25 Ёпрст
 
17.05.12
13:01
(24) самое тупое, посмотреть size в этой табличке
26 774816
 
17.05.12
13:09
Как вариант можно, через ADOX + ADODB.Recordset, в цикле списка имен таблиц, формировать запрос с Count(*) передавать Recordset-у  и возвращать значение для проверки
27 ученик_0117
 
17.05.12
13:14
(23)стесняюсь спросить а как передать имена всех таблиц?
28 slowpoke1C
 
17.05.12
13:14
Вот с айбэйза: ibase.ru
читать сначала http://ibase.ru/devinfo/sysqry.htm потом
http://citforum.ru/database/interbase/index.shtml
Получение списка полей и их типов по таблицам:

select R.RDB$RELATION_NAME, R.RDB$FIELD_POSITION, R.RDB$FIELD_NAME,
F.RDB$FIELD_LENGTH, F.RDB$FIELD_TYPE, F.RDB$FIELD_SCALE, F.RDB$FIELD_SUB_TYPE
from RDB$FIELDS F, RDB$RELATION_FIELDS R
where F.RDB$FIELD_NAME = R.RDB$FIELD_SOURCE and R.RDB$SYSTEM_FLAG = 0
order by R.RDB$RELATION_NAME, R.RDB$FIELD_POSITION

Если вам не нравится нумерация полей с 0, то можно вместо R.RDB$FIELD_POSITION написать R.RDB$FIELD_POSITION+1. Для получения списка полей конкретной таблицы нужно добавить соответствующее условие к where - and RDB$RELATION_NAME = 'MYTABLE'.
29 slowpoke1C
 
17.05.12
13:15
(23) опять меня опередили :-(
30 Ненавижу 1С
 
гуру
17.05.12
13:17
CREATE OR ALTER PROCEDURE MYPROC
returns (Name Char(31))
AS
 declare variable C Integer;
 declare variable S Varchar(100);
begin
FOR SELECT rdb$relation_name FROM rdb$relations WHERE rdb$view_blr IS NULL AND rdb$system_flag <> 1 INTO :Name DO
BEGIN
 S = 'select count(*) from '||:Name;
 EXECUTE STATEMENT :S INTO :C;
 IF (:C>0) THEN
 BEGIN
   SUSPEND;
 END
END
end


SELECT * FROM MYPROC
31 ученик_0117
 
17.05.12
13:46
execute block returns (empty_table varchar(31)) as
declare v_cnt smallint;
declare v_sql varchar(255);
begin
   for
       select r.rdb$relation_name
       from rdb$relations r
       where coalesce(r.rdb$system_flag,0)=0 -- не смотрим на системные таблицы
       and r.rdb$relation_type not in(4,5) -- убираем GTT'шки
       and r.rdb$view_source is null -- убираем вьюхи
   into empty_table
   do begin
     v_sql='select count(*) from (select first 1 * from '||empty_table||')';
     execute statement (v_sql) into :v_cnt;
     if (v_cnt=0) then suspend;
   end
end.


а как сделать чтоб  сохранялись в txt или как нить еще?
32 Ненавижу 1С
 
гуру
17.05.12
13:48
(31) ну это уже от приложения зависит
неужели нет возможности никак сохранить?
33 ученик_0117
 
17.05.12
13:49
(32) а если вписать save  as  и путь дериктории?
34 ЧеловекДуши
 
17.05.12
13:55
(33)Напиши лучше через делфятину, там еще пропишешь, как и куда сохранить те или иные таблицы :)
35 ученик_0117
 
18.05.12
07:47
спасибо всем кто откликнулся.....