MySql синтаксис вопрос - PullRequest
       5

MySql синтаксис вопрос

0 голосов
/ 19 октября 2010

Почему это работает идеально:

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: у вас ошибка в синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'NULL' в строке 1

Ответы [ 2 ]

0 голосов
/ 19 октября 2010

Я смог заставить его работать со следующим:

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 голосов
/ 19 октября 2010

попробуйте это:

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; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...