2010-06-17 40 views
1

INFORMIX-SQL或任何其他基于SQL-DB:变量表或者列名

假设我有哪里取决于一些列的值的应用程序,例如:

company.code char(3) {abc} 
company.branch char(2) {01} 

我可以构建表名称“abc01”包含在SELECT * FROM abc01中; ? 换句话说,一个变量表名称..同样的问题适用于列名称。

回答

3

只能用于处理字符串和处理动态SQL的语言。它必须即时创建声明。

只能在查询中使用占位符,而不能用于查询的结构元素,例如表名或列名。

+0

是否可以发送一个表的名称作为函数中的参数并执行SELECT? – 2012-10-08 15:21:20

+0

@PaulVargas:有点......但通常不是很明智。存储过程中的动态SQL功能在11.70(11.50?)Informix中意味着您可以执行此操作。问题是“什么是数据的返回类型”,以及如何通过具有固定签名的过程来返回它。对于短字符串和数字或时态类型,您可以退出VARCHAR(255)并让转换处理它;它会工作。但它不适用于完全任意的数据类型 - 长字符串和一些用户定义的类型等。所以答案是“不是真的,但如果你真的想尝试,你可以尝试”。 – 2012-10-08 18:56:50

2

只有当您使用动态sql。这就像你在你的应用程序中构建sql代码,然后使用类似execute immediate的东西。

sprintf(cdb_text1, "create table %s (field1 char(3));", usr_db_id); 
EXEC SQL execute immediate :cdb_text; 

如果使用动态sql,由于sql注入而不好。

+1

不小心使用的动态SQL肯定会导致[SQL注入](http://xkcd.org/327),但仅仅使用动态SQL不会自动成为问题。这取决于你多么小心。这个特殊的例子并不重要,有一个CHAR(3)和一个CHAR(2)字段来保存'用户数据',所以没有太大的恶作剧的范围(Old“Robert”); DROP TABLE Students; - “根本不适合5个字符。 – 2010-06-17 05:26:23

+0

在这种情况下,这并不危险。但是,如果我使用动态SQL,我需要/想知道,这种可能性存在,对吗? – ksogor 2010-06-17 05:40:30

+1

如果动态值的来源是用户,则需要考虑SQL注入的含义。 如果生成的SQL的动态方面纯粹是程序的内部业务逻辑,那么这是一个完全不同的问题,您只需要考虑如何处理出现在这些列中的意外/空值。尽管如此,如果你发现你需要这样做,你应该对你的数据模型非常关键。这听起来很脆弱。 – RET 2010-06-17 06:05:34