1

我传入了一个逗号分隔的值列表,我需要将这些值与数据库进行比较

这是我传入的值的示例:

@orgList = "1123, 223%, 54%"

要使用通配符,我认为我必须这样做LIKE,但查询运行了很长时间并且只返回 14 行(结果是正确的,但它只是需要永远,可能是因为我使用了不正确的连接)

我可以做得更好吗?

这就是我现在所做的:

declare @tempTable Table (SearchOrg nvarchar(max) )

insert  into @tempTable
   select * from dbo.udf_split(@orgList) as split 

-- this splits the values at the comma and puts them in a temp table

-- then I do a join on the main table and the temp table to do a like on it.... 
-- but I think it's not right because it's too long. 

select something 
from maintable gt
join @tempTable tt on gt.org like tt.SearchOrg
where
    AYEAR= ISNULL(@year, ayear)
    and (AYEAR >= ISNULL(@yearR1, ayear) and ayear <= ISNULL(@yearr2, ayear))
    and  adate = ISNULL(@Date, adate)
    and (adate  >= ISNULL(@dateR1, adate) and adate <= ISNULL(@DateR2 , adate))

最终结果将maintable.org是 1123 或以 223 开头或以 554 开头的所有行

我的日期疯狂的原因是因为有时存储过程只检查一年,有时检查一年范围,有时检查特定日期,有时检查日期范围......所有未使用的东西都作为空值传入。

也许问题在那里?

4

3 回答 3

1

尝试这样的事情:

Declare @tempTable Table
(
   -- Since the column is a varchar(10), you don't want to use nvarchar here.
   SearchOrg varchar(20)
);

INSERT INTO @tempTable
SELECT * FROM dbo.udf_split(@orgList);

SELECT 
   something
FROM 
   maintable gt
WHERE
   some where statements go here
And
   Exists
   (
      SELECT 1
      FROM @tempTable tt
      WHERE gt.org Like tt.SearchOrg
   )
于 2013-02-27T14:03:10.213 回答
1

您的查询可能难以优化。部分问题是where条款中的内容。您可能想先过滤这些,然后使用like. 或者,您可以尝试加快连接速度,然后对结果进行全表扫描。

SQL Server 应该优化like'abc%' 形式的语句——即通配符位于末尾的位置。(例如,请参见此处。)因此,您可以从 上的索引开始maintable.org。幸运的是,您的示例符合此标准。但是,如果您有 '%abc'(通配符在前),那么优化将不起作用。

为了使索引发挥最佳作用,它可能还需要考虑where子句中的条件。换句话说,添加索引是暗示性的,但查询的其余部分可能会排除索引的使用。

而且,让我补充一下,这些类型的搜索的最佳解决方案是使用 SQL Server 中的全文搜索功能(请参阅此处)。

于 2013-02-27T14:14:27.503 回答
1

这种带有可选过滤器LIKE并由表(!)驱动的动态查询很难优化,因为几乎没有什么是静态已知的。优化器必须创建一个非常通用的计划。

您可以通过magnitute做两件事来加快速度:

  1. OPTION (RECOMPILE)。如果编译times是可接受的,这将至少处理所有可选过滤器(但不处理 LIKE 表)。
  2. 做代码生成和EXEC sp_executesql代码。使用内联到 SQL 中的所有子句构建一个查询LIKE,使其看起来像这样:(WHERE a LIKE @like0 OR a LIKE @like1 ...不确定是否需要ORor AND)。这允许优化器摆脱连接并只执行普通谓词)。
于 2013-02-27T14:29:50.080 回答