1

给定一对变量中的表名和列名,我可以在不使用动态 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 倍(它不支持可编程的表/列名,因此这个问题)。

4

2 回答 2

2

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

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

于 2009-06-15T21:15:22.860 回答
1

所以听起来问题是您是否可以在运行时构建和运行查询而不使用动态 SQL?

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

  • 动态 SQL - 调用sp_ExecuteSQLExec()给定用户构建的字符串。无论是使用 ADO 库和 Command 对象的传递 SQL,还是直接在存储过程中。
  • 编译的 SQL - 使用通常的对象(sprocs 和 UDF)以及与已知良好对象交互的已知良好语句。在这种情况下,解析是预先完成的。
于 2009-06-15T21:13:43.033 回答