如何将字符串变量用于SQL Server索引提示



我有一个带有几何列的SQL Server 2012数据库表,并且该表上有一个空间索引。

我有一个SQL查询,我经营该查询来进行一些地理空间分析(相交/包含)和查询执行的性能在强迫使用空间索引而不是(根据此答案取决于此答案的大小)时有很大不同我使用的桌子)。我的桌子只是1-2k的polys和1-2k的点。

所以,我在SQL查询中使用WITH (INDEX(S7_idx)),其中S7_idx是我的空间索引的名称。

但是,当我在具有相同表的另一个数据库上执行此SQL查询时,空间索引可能具有另一个名称。因此,我不想硬编码索引名称。我认为如果我可以动态地检索索引值,那将是很棒的,因为我可以确定表上只有一个空间索引。

select name from sys.indexes where object_id = (select object_id from sys.objects where name = 'TableName') AND type_desc = 'SPATIAL'

结果:

name S7_idx

太好了。现在,我想在WITH语句中使用此值,而不是硬编码的索引名称。我该怎么做?

我认为我不能在我的WITH (INDEX(...))语句中使用动态SQL(带有EXECUTE sp_executesql)。

使用hints,除非您有经验丰富的DBA建议。将statistics掌握到数据将解决这么多问题。

如果您确定使用的hint,则需要使用动态查询

DECLARE @sql VARCHAR(8000)= ''
SET @sql = 'SELECT *
FROM TableName
WITH (INDEX('
           + (SELECT NAME
              FROM   sys.indexes
              WHERE  object_id = (SELECT object_id
                                  FROM   sys.objects
                                  WHERE  NAME = 'TableName')
                     AND type_desc = 'SPATIAL')
           + '))'
PRINT @sql
EXEC(@sql) 

注意:在您表中查询中的查询考虑,index只有一个type_desc = 'SPATIAL'

最新更新