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

例如,我想要一些 更好 比这个:

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倍,仅仅是因为您将要交换和移出表名,而解析器无法为此进行优化。

您可能需要在例程中使用嵌套开关语句,并使用它从预定义的表/列中选择您的选择语句,尤其是如果您的架构不会经常更改。那应该运行得更快,但是您将失去真正的动态性。

其他提示

因此,听起来的问题是您是否可以在运行时构建和运行查询,而无需使用动态SQL?

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

  • 动态SQL-调用 sp_ExecuteSQL 或者 Exec() 给定一个用户构建的字符串。无论是使用ADO库和命令对象的传递SQL,还是在Sproc中。
  • 编译SQL-使用常规对象(sprocs和udf)与已知的良好语句与已知的好对象相互作用。在这种情况下,预先解析是事先进行的。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top