这是我的主要查询:
exec sp_executesql N'set arithabort off;set transaction isolation level read uncommitted;Select COUNT(*) From ( Select ROW_NUMBER() OVER
(Order By Case When d.OldInstrumentID IS NULL THEN d.LastStatusChangedDateTime Else d.RecordingDateTime End desc ) peta_rn,
d.DocumentID
From Documents d
Inner Join Users u on d.UserID = u.UserID Inner Join IGroupes ig on ig.IGroupID = d.IGroupID
Inner Join ITypes it on it.ITypeID = d.ITypeID Where 1=1 ANd dbo.DoesNameExist(d.DocumentID, @0, @1, @2, @3) = 1 And (CreatedByAccountID = @4
Or DocumentStatusID = @5
Or DocumentStatusID = @6 ) )
v',N'@0 int,@1 varchar(4000),@2 varchar(4000),@3 nvarchar(4000),@4 int,@5 int,@6 int',@0=-999,@1='K',@2='Miller',
@3=NULL,@4=44,@5=5,@6=9
这是我的标量函数,这是罪魁祸首:
ALTER FUNCTION [dbo].[DoesNameExist]
(
@DocumentID int,
@PartyTypeID int = 0,
@FirstName varchar(30),
@LastName varchar(30),
@Business varchar(100)
)
RETURNS bit
AS
BEGIN
Declare @Found bit = 0
Set @FirstName = IsNull(@FirstName,'')
Set @LastName = IsNull(@LastName,'')
Set @Business = IsNull(@Business,'')
Select Top 1 @Found = 1
From DocumentNames
Where DocumentID = @DocumentID
And
Lower(IsNull(FirstName,'')) Like
Case When @FirstName = '' Then Lower(IsNull(FirstName,'')) + '%'
Else Lower(@FirstName) + '%' End
And
Lower(IsNull(LastName,'')) Like
Case When @LastName = '' Then Lower(IsNull(LastName,'')) + '%'
Else Lower(@LastName) + '%' End
And
Lower(IsNull(Business,'')) Like
Case When @Business = '' Then Lower(IsNull(Business,'')) + '%'
Else Lower(@Business) + '%' End
And
PartyTypeID = Case When @PartyTypeID IS NULL OR @PartyTypeID <= 0 Then PartyTypeID Else @PartyTypeID End
Return @Found
END
基本上一个文档有多个 DocumentNames,当用户在 LastName 或 FirstName 中键入内容时,我想计算所有具有这些匹配名称的文档的计数。请注意,我正在查询 Documents 表,然后加入 DocumentNames。这是必要的。
注意:索引是在所有搜索列上创建的,包括 FirstName、LastName 等。
谢谢!