2010-06-04 11 views
17

Örneğin, bu işe yaramazsa:MySQL'de: Tablo adı saklı yordam ve/veya işlev argümanı olarak nasıl iletilir?

DELIMITER // 
CREATE PROCEDURE countRows(tbl_name VARCHAR(40)) 
    BEGIN 
    SELECT COUNT(*) as ct FROM tbl_name; 
    END // 

DELIMITER ; 
CALL countRows('my_table_name'); 

üretir: Ancak

ERROR 1146 (42S02): Table 'test.tbl_name' doesn't exist 

, bu beklendiği gibi çalışır: Bir olarak bir tartışmayı kullanmak için neler gereklidir sözdizimi

SELECT COUNT(*) as ct FROM my_table_name; 

tablo bir seçim ifadesinde? Bu mümkün mü?

+1

Bu mümkün olsa bile, bu aşağı inmeniz gereken bir yol değildir. S'procs'u gerçekten istediğiniz sql ile oluşturun ya da kodunuzda ad hoc sql dosyasını yerleştirin. – NotMe

+3

@Chris Burada niyet ve güç görebilirsiniz, değil mi? Bir tablo adının genel bir işleve geçirilmesi. Bunu mükemmel bir şekilde yasal ve gerekli görüyorum. Bir sproc sonucunu kontrol etmenin neden kötü olduğunu anlamama yardım et? Söylediklerinizden, bir .NET geliştiricisi ve bir PHP geliştiricim varsa, aynı sonuç kümesini elde etmek için kendi kodlarını yazmasını istemen gerekir mi? –

+0

Amaç görüyorum ve kusurlu. Aşağıdakileri okumanızı şiddetle öneririm: http://www.sommarskog.se/dynamic_sql.html Ms sql sunucusunu kapsamasına rağmen, dersler aynıdır. – NotMe

cevap

24

Prepared statements ihtiyacınız olan şeydir.

CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40)) 
BEGIN 
SET @t1 =CONCAT('SELECT * FROM ',tab_name); 
PREPARE stmt3 FROM @t1; 
EXECUTE stmt3; 
DEALLOCATE PREPARE stmt3; 
END $$ 
+0

+1: İlk sizdiniz & doğru - Hazırlanmış Bildirimleri (MySQL'in dinamik SQL) kullanmanız gerekir: http://rpbouman.blogspot.com/2005/11/mysql-5-prepared-statement-syntax-and.html –

+0

rawesome. Bir milyona teşekkürler. –

+2

'CALL GetNumRows (gps_location)' İadeler: '# 1054 - 'alan listesinde' bilinmeyen sütun 'gps_location' ' – Pachonk

İlgili konular