2010-10-19 7 views
0

Pourquoi ce travail parfaitement:MySql question de syntaxe

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; 

mais cela ne fait pas:

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; 

et ne le fait:

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; 

Ni le fait:

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; 

Voici la partie du sproc qui me donne des problèmes:


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'); 

Le select retourne rien quand il devrait revenir à environ 40 lignes. MAIS, si je code dur le mot «résidents» dans la @columnQuery, j'obtiens des résultats! Et oui, il y a certainement une table nommée 'résidents'.

Parfois, je reçois cette erreur, parfois non, selon que j'utilise CONCAT ou tout simplement des chaînes manuellement: concaténer

MySQL Database Erreur: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près « NULL » à la ligne 1

Répondre

0

j'ai pu obtenir de travailler avec les éléments suivants:

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

Génial! Fonctionne comme un charme. Alors, quel est l'affaire? Les paramètres d'entrée ne peuvent pas être utilisés directement dans les instructions? Je dois les mettre dans une variable locale en premier? Bizarre. – Blackcoil

0

essayez ceci:

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

Cela a provoqué une erreur car l'USING doit être après l'EXECUTE. – Blackcoil

+0

mon mauvais - je vais mettre à jour. –

+0

Cela ne fonctionne toujours pas. :) – Blackcoil