2010-10-19 4 views
0

Почему это работает отлично:MySql синтаксис вопрос

SET @columnQuery = 'INSERT INTO ColumnNames SELECT ORDINAL_POSITION, COLUMN_NAME FROM information_schema.columns WHERE TABLE_NAME=''residents'' ORDER BY ORDINAL_POSITION;'; 

PREPARE STMT FROM @columnQuery; 
EXECUTE STMT; 

, но это не делает: не

DECLARE TableName VARCHAR(50); 
SET @TableName = 'residents'; 

SET @columnQuery = 'INSERT INTO ColumnNames SELECT ORDINAL_POSITION, COLUMN_NAME FROM information_schema.columns WHERE TABLE_NAME=''' + @TableName + ''' ORDER BY ORDINAL_POSITION;'; 

PREPARE STMT FROM @columnQuery; 
EXECUTE STMT; 

и ни делает это:

DECLARE TableName VARCHAR(50); 
SET @TableName = 'residents'; 

SET @columnQuery = CONCAT('INSERT INTO ColumnNames SELECT ORDINAL_POSITION, COLUMN_NAME FROM information_schema.columns WHERE TABLE_NAME=''', @TableName, ''' ORDER BY ORDINAL_POSITION;'); 

PREPARE STMT FROM @columnQuery; 
EXECUTE STMT; 

Ни делает это:

SET @columnQuery = 'INSERT INTO ColumnNames SELECT ORDINAL_POSITION, COLUMN_NAME FROM information_schema.columns WHERE TABLE_NAME=? ORDER BY ORDINAL_POSITION;'; 

PREPARE STMT FROM @columnQuery; 
EXECUTE STMT USING @TableName; 

Вот часть sproc, которая дает мне вопросы:


CREATE PROCEDURE sp_ReturnSingleRowAsXml 
(
    IN TableName VARCHAR(50) 
) 
BEGIN 

DECLARE columnQuery VARCHAR(1000); 

DROP TABLE IF EXISTS ColumnNames; 

CREATE TEMPORARY TABLE ColumnNames (
    ID INT, ColumnName VARCHAR(50) 
); 

SET @columnQuery = 'INSERT INTO ColumnNames SELECT ORDINAL_POSITION, COLUMN_NAME FROM information_schema.columns WHERE TABLE_NAME=''' + @TableName + ''' ORDER BY ORDINAL_POSITION;'; 

PREPARE STMT FROM @columnQuery; 
EXECUTE STMT; 

select * from ColumnNames; 

END; 

CALL sp_ReturnSingleRowAsXml('residents'); 

Выбрать, возвращает ничего, когда он должен вернуть около 40 строк. НО, если я жестко кодирую слово «жители» в @columnQuery, я получаю результаты! И да, определенно есть таблица под названием «жители».

Иногда я получаю эту ошибку, иногда у меня нет, в зависимости от того ли я с помощью CONCAT или просто вручную конкатенации строк:

MySQL Database Error: У вас ошибка в вашем SQL синтаксиса; проверьте руководство, которое соответствует версии сервера MySQL для правильного синтаксиса, чтобы использовать рядом с «NULL» в строке 1

ответ

0

Я был в состоянии получить его на работу со следующим:

CREATE PROCEDURE `sp_ReturnSingleRowAsXml`( 
    IN TableName VARCHAR(50) 
) 
BEGIN 

DROP TABLE IF EXISTS ColumnNames; 

CREATE TEMPORARY TABLE ColumnNames ( 
    ID INT, ColumnName VARCHAR(50) 
); 
SET @tblName = TableName; 
SET @columnQuery = 'INSERT INTO ColumnNames SELECT ORDINAL_POSITION, COLUMN_NAME FROM information_schema.columns WHERE TABLE_NAME=? ORDER BY ORDINAL_POSITION;'; 

PREPARE STMT FROM @columnQuery; 
EXECUTE STMT USING @tblName; 

select * from ColumnNames; 

END 
+0

Удивительный! Работает как шарм. Так в чем же дело? Входные параметры нельзя использовать непосредственно в операторах? Сначала я должен поместить их в локальную переменную? Weird. – Blackcoil

0

попробовать это:

DECLARE TableName VARCHAR(50); 
SET @TableName = 'residents'; 

SET @columnQuery = 'INSERT INTO ColumnNames SELECT ORDINAL_POSITION, COLUMN_NAME FROM information_schema.columns WHERE TABLE_NAME=? ORDER BY ORDINAL_POSITION;'; 

PREPARE STMT FROM @columnQuery; 
EXECUTE STMT USING @TableName; 
+0

Это ошибка, потому что ИСПОЛЬЗОВАНИЕ должно быть после EXECUTE. – Blackcoil

+0

мой плохой - обновлю. –

+0

Это все еще не работает. :) – Blackcoil

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