2015-09-30 4 views
0

Я хочу, чтобы пользователь вводил любую базу данных, которую они хотят проверить, и любые таблицы, которые они хотят проверить. Например, вызов будет выглядеть так:Проверить, есть ли таблицы в базе данных - хранимая процедура - MySQL

call tableCheck('MyDatabase', 'table1 table20 table3') 

Таким образом, процедура проверит эти таблицы (пробел). У меня есть код ниже, но у меня проблемы с проверкой других таблиц, он читает первый, но не второй или третий. SO мой код не зацикливается или не читает следующее слово.

PROCEDURE `tableCheck` (db VARCHAR(256), db_tables VARCHAR(256)) 
BEGIN 
DECLARE tbl, tbls VARCHAR(256); 
DECLARE c INT DEFAULT 0; 

SET tbls = db_tables; 

    WHILE c = 0 DO 

     #split word 
     SET tbl = SUBSTRING_INDEX(tbls," ",1); 
     #go to next string 
     SET tbls = SUBSTR(tbls,LENGTH(tbl)+1); 

     #check every table 
     SELECT table_name AS 'Table Name' 
     FROM INFORMATION_SCHEMA.TABLES 
     WHERE table_schema=db AND table_name=tbl; 

     IF tbls = 0 THEN 
      SET c = 1; 
     END IF; 
    END WHILE; 
END 
+0

Если ваши таблицы начинаются с цифр , 'tbls = 0' всегда будет true. – Uueerdo

+0

Я вижу, что он всегда закрывается после первого цикла. Поэтому я должен найти другой путь для закрытия цикла. @Uueerdo – Jim

+0

Вы можете сделать свой тест что-то вроде этого 'tbls REGEXP '[a-zA-Z] +'' – Uueerdo

ответ

0

Я передал эту ссылку несколько раз сегодня ... так что, возможно, это сработает и для вас. Convert a delimited string to a list of values

Использование функции dbo.fnArray из этой ссылке, вы должны быть в состоянии присоединиться на INFORMATION_SCHEMA.TABLES, как это:

create procedure dbo.spCheckTable @db varchar(256), @tbls varchar(8000) 
as 
begin 
    select * 
     from INFORMATION_SCHEMA.TABLES i 
    inner join dbo.fnArray(@tbls, ' ') t on i.TABLE_NAME = t.arrValue 
    where i.TABLE_CATALOG = @db 
end 

Теперь не его хранимая процедура

+0

Ах, я вижу, что вы делаете, но я хочу избежать использования функций. Я хочу сохранить все это в одной хранимой процедуре. – Jim

+0

Обновлено мое решение, поэтому теперь это хранимая процедура. Не знаете, почему вы хотите избежать функций. Большинство людей стремятся внедрить СУХИЕ принципы и другие шаблоны. – ewahner

Смежные вопросы