【问题标题】:How to rewrite select statement if it contains function?如果它包含函数,如何重写select语句?
【发布时间】:2018-10-09 10:55:53
【问题描述】:

经过我的所有优化后,我发现该 select 语句的存储需要大量时间,因为它包含 select 和 where 条件中的函数。请帮我重写select语句。

if OBJECT_ID('QATR_TestCase0003_ElementElIDContainsUpperCase')         
is not null drop table QATR_TestCase0003_ElementElIDContainsUpperCase        
select elid, tsmkey, dbo.[ContainCapLetter](elid) ContaintCap ,  
cast('Element elid  '+elid+' contains UPPER CASE in GenProductsAll ' as 
nvarchar(255)) datastatus         
into QATR_TestCase0003_ElementElIDContainsUpperCase from TblGenProductsAll        
where dbo.[ContainCapLetter](elid) <>0

下面是我写的函数:

CREATE FUNCTION [dbo].[ContainCapLetter] (@str1 as nvarchar(255))    
RETURNS int  
BEGIN   
declare @j int,  @i int
set @i=0  
 select @j = len(@str1)  

while @j >0  
begin  
If unicode(left(@str1,1)) not between 64 and 91  
begin  
set @str1 = right(@str1,len(@str1)-1)  
select @j= len(@str1)  
end  

Else If unicode(left(@str1,1)) between 64 and 91  
begin  
set @i= 1  
set @j= 0  
end  

end  
return @i  
END  

【问题讨论】:

    标签: sql-server performance function optimization conditional-statements


    【解决方案1】:

    你可以试试这个。

    select elid, tsmkey, 
        CASE WHEN elid like '%[ABCDEFGHIJKLMNOPQRSTUVWXYZ]%' COLLATE Latin1_General_CS_AS THEN 1 ELSE 0 END ContaintCap ,
        cast('Element elid  '+elid+' contains UPPER CASE in GenProductsAll ' as nvarchar(255)) datastatus         
    into QATR_TestCase0003_ElementElIDContainsUpperCase 
    from TblGenProductsAll        
    where 
        elid like '%[ABCDEFGHIJKLMNOPQRSTUVWXYZ]%' COLLATE Latin1_General_CS_AS
    

    【讨论】:

    • 为什么 A-z 处于类似状态。请问我可以知道吗
    • 他在区分大小写的排序规则中查找大写字符,因此排除了 [a-z]。
    • 它检查列是否包含任何大写字符
    • @SerkanArslan 谢谢。是否可以在选择状态中替换功能
    猜你喜欢
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2017-12-07
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 2018-03-03
    相关资源
    最近更新 更多