初学者使用参数化查询易犯的错误是仍以字符串格式化变量的观点理解查询参数。有的程序员老想把数据列名称也作为可变的参数,结果要么执行出错,要么输出数据出乎意料。比如为SQL语句“SELECT column1,? FROM table1”指定参数“column2”,查询的结果的第2列并不是数据表table1的column2数据列的数据,而是在每条记录中都是字符串column2本身。
要知道,数据表、数据列的名称在SQL语句中视为元数据,而数据列中的值才是某种类型的数据,可以作为查询参数。这就跟程序设计语言中函数、类的名称与字符串变量是两码事一样。事实上,如果数据列、数据表、数据库的名称甚至关键字可以在参数中改变,则查询计划没法预先生成,并且参数化查询的安全性也不再存在。
不少数据库中可使用TOP 或LIMIT关键字限制查询结果输出的行数。如果应用程序可动态指定输出行数的多少,有时确实很方便。不过,由于行数并不是数据列的值,绝大多数数据库都还不支持TOP ?或LIMIT ?形式的参数化查询。实际上如果数据库引擎稍作改进,是完全可以支持这种查询方式的。在目前,您大概只能用字符串拼凑的方法设置输出的行数。
另外这里也客观地指出,应用程序中调试参数化查询比调试不含参数的SQL查询要困难一些。使用者最好充分使用ADO、ADO.NET、ODBC及开发工具中的诊断功能,以尽快发现和定位故障。