我使用以下查询从数据库中获取记录。
SELECT
[dbo].[CamelCase](ISNULL(B.City, '')),
CONVERT(VARCHAR(250), ISNULL(B.Addr1, '') + '/' + ISNULL(B.Addr2, '') + '/' + ISNULL(B.Area, '') + '/' + ISNULL(B.City, '') + '/' + ISNULL(B.State, '')),
ISNULL(B.YardName, ''),
DATEADD(HH, 10, CONVERT(DATETIME, A.Date_From)),
DATEADD(HH, 17, CONVERT(DATETIME, A.Date_To)),
'',
ISNULL(B.Zone, ''),
'',
'',
ISNULL(B.ContactPerson, ''),
B.Mobile,
ISNULL(B.EMailId, ''),
'',
A.AucCode,
[dbo].[CamelCase](B.State),
B.Pincode,
[dbo].[CamelCase](ISNULL(B.City, ''))
FROM dbo.TBL_Auction A
JOIN dbo.TBL_PLACE B ON A.Auc_Place_Fk_Id = B.Place_Pk_Id
TBL_Auction中的索引表:
Index Name ------------------- + Column Name -------- + Index Type
PK__PASS_AUC__8BC43C38517CE882 | Auc_Pk_Id | CLUSTERED
IX_PASS_Created_On | Created_On | NONCLUSTERED
Unq_Pass_Auction | Auc_Code | NONCLUSTERED
Unq_Pass_Auction | Auc_Place_Fk_Id | NONCLUSTERED
FK_Pass_Place | Auc_Place_Fk_Id | NONCLUSTERED
TBL_Place表中的索引:
Index Name ------------------ + Column Name------- + Index Type
PK__PASS_PLA__4F8634950F7A1AFB | Place_Pk_Id | CLUSTERED
IX_PASS_PLACE_I | Place_Area | NONCLUSTERED
IX_PASS_PLACE_I | Place_City | NONCLUSTERED
IX_PASS_PLACE_I | Place_State | NONCLUSTERED
IX_PASS_PLACE_I | Place_Country | NONCLUSTERED
IX_PASS_PLACE_I | Place_Pincode | NONCLUSTERED
IX_PASS_PLACE_IV | Place_Shrt_Code | NONCLUSTERED
但是上面的查询需要无限的时间来返回结果。
我为连接表创建了所有必要的索引。即使在此之后,优化器也会选择索引扫描而不是索引搜索。您可以在我的问题中检查索引列表中的两个表。如何强制优化器选择索引查找?
当我使用选择* 而不是指定选择列名时,此时查询结果已在1秒内返回。在Select query中指定列名时会出现什么问题?
修改: -
ALTER FUNCTION [dbo].[CamelCase]
(@Str varchar(8000))
RETURNS varchar(8000) AS
BEGIN
DECLARE @Result varchar(2000)
SET @Str = LOWER(@Str) + ' '
SET @Result = ''
WHILE 1=1
BEGIN
IF PATINDEX('% %',@Str) = 0 BREAK
SET @Result = @Result + UPPER(Left(@Str,1))+
SubString (@Str,2,CharIndex(' ',@Str)-1)
SET @Str = SubString(@Str,
CharIndex(' ',@Str)+1,Len(@Str))
END
SET @Result = Left(@Result,Len(@Result))
RETURN @Result
END
答案 0 :(得分:4)
如果传递NULL
,则驼峰案例函数将进入无限循环,因为退出的唯一方法是PATINDEX('% %',@Str)= 0
,并且评估为未知。
你需要解决这个问题。
你可以使用RETURNS NULL ON NULL INPUT
但为了安全起见我也会明确处理它。
ALTER FUNCTION [dbo].[CamelCase]
(@Str VARCHAR(8000))
RETURNS VARCHAR(8000)
WITH RETURNS NULL ON NULL INPUT,
SCHEMABINDING
AS
BEGIN
IF @Str IS NULL
RETURN NULL;
/*.... Rest of function*/