如何传入列名和表名时,如何运行查询?

时间:2009-06-15 21:02:06

标签: performance sql-server-2000 dynamic-sql

给定一对变量中的表名和列名,我可以在不使用动态sql的情况下执行select查询吗?

例如,我想要更好的东西:

CREATE PROCEDURE spTest (@table NVARCHAR(30), @column NVARCHAR(30)) AS

  DECLARE @sql NVARCHAR(2000) 
  SELECT @sql = N'SELECT ' + @column + N' FROM ' + @table
  PRINT @sql

  EXEC sp_executesql @sql

我想这样做是因为我的动态sql版本比非动态版本慢3倍(它不支持可编程的表/列名称,因此这个问题)。

2 个答案:

答案 0 :(得分:2)

动态版本将慢3倍,仅仅是因为你要交换表名,而解析器无法对其进行优化。

您可能希望在例程中使用排序的switch语句,并使用它来从预定义的表/列中选择SELECT语句,尤其是在不经常更改架构的情况下。这应该跑得快得多,但你会失去真正的动态。

答案 1 :(得分:1)

所以听起来问题是你是否可以在不使用动态SQL的情况下在运行时构建和运行查询?

我会说答案是否定的。选择是:

  • 动态SQL - 在给定用户构建的字符串的情况下调用sp_ExecuteSQLExec()。是使用ADO库和Command对象的传递SQL,还是在sproc中。
  • 编译SQL - 使用通常的对象(sprocs和UDF),使用与已知良好对象交互的已知良好语句。在这种情况下,预先进行解析。