给定一对变量中的表名和列名,我可以在不使用动态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倍(它不支持可编程的表/列名称,因此这个问题)。
答案 0 :(得分:2)
动态版本将慢3倍,仅仅是因为你要交换表名,而解析器无法对其进行优化。
您可能希望在例程中使用排序的switch语句,并使用它来从预定义的表/列中选择SELECT语句,尤其是在不经常更改架构的情况下。这应该跑得快得多,但你会失去真正的动态。
答案 1 :(得分:1)
所以听起来问题是你是否可以在不使用动态SQL的情况下在运行时构建和运行查询?
我会说答案是否定的。选择是:
sp_ExecuteSQL
或Exec()
。是使用ADO库和Command对象的传递SQL,还是在sproc中。