繁体   English   中英

SQL函数忽略特定条件

[英]SQL Function to ignore specific criteria

我经常编写在WHERE语句中具有重复几行的SQL脚本,以消除记录。

例如:

SELECT *
FROM tblAll
WHERE Field1 NOT LIKE '%AA%'
AND Field1 NOT LIKE '%BB%'
AND Field1 NOT LIKE '%00'

如果我不必每次都添加这些行,则不太容易出错。 我如何创建一个函数来代替我呢?:

SELECT *
FROM tblAll
WHERE Field1 NOT LIKE Function

这是我目前拥有的:

CREATE FUNCTION [dbo].[ExcludeField1]
(
    @Field1 varchar(max),
    @Date datetime
)
RETURNS VARCHAR(15) AS 
BEGIN

    DECLARE @Field1 varchar(15)
    DECLARE @Date datetime
    SELECT TOP 1 @Field1=Field1 ,@Date=Date
        FROM tblAll A
        WHERE A.Date=@Date
        AND Field1 NOT LIKE '%AA%'
        AND Field1 NOT LIKE 'BB%'
        AND Field1 NOT LIKE '%00%'
        ORDER BY LEN(A.Field1) ASC ;


    RETURN @Field1
END

GO

但是我觉得我缺少重要的东西。 该函数仅提供我认为对Field1有效的值。 所以我未来的脚本应该是:

Field1 = @Field1

什么不对

您尝试执行的操作可能不是最佳方法。

您正在尝试通过添加使编程更容易的方式来缩短代码的速度。

如果文件很大,这可能是灾难性的。 如果文件很小,那么它仍然很麻烦。

您可能会发现最好创建一个临时表,该临时表仅执行重复的内容,然后将该较小的临时文件调用到您的其他代码中(更好的可读性)。 这使将来的人们找到您的代码时更具可读性,并减少了后续代码的大小(和复杂性)。 根据您所运行的SQL的类型,您甚至可以将临时表代码放入一个子proc中,该子proc可以在每个需要它的SQL查询之前被调用。

不过,只要在需要查询的每个查询中添加额外的代码,您就会获得更好的性能。 这样,SQL可以决定最快的方法是获取数据并将其发送回给您。 (即使SQL代码非常庞大,并且您必须在许多不同的查询中重复相同的代码段。)

但是,如果您坚持要能够插入不变的代码段。 您可以尝试使用其他语言(例如Visual Basic,C或VBA等)构建SQL代码,您可以在其中创建代码字符串。 然后,您可以连接到SQL数据库并发送生成的SQL代码并执行它。 这使您可以构建各种Frankenstein代码。 (甚至可以让您构建交互前端,以便用户可以添加各种不同的参数。)但是请注意...在这些山洞中玩耍的各种令人讨厌的龙。

就个人而言,如果您的目标是简化重复代码并对其进行排序,我将使用临时文件。

希望有点帮助。 :)

编辑

糟糕,我们不要忘记动态SQL(如果您的SQL版本具有动态SQL):

DECLARE @sql nvarchar(max);
DECLARE @snippet nvarchar(max);

set @snippet=
    'Field1 NOT LIKE ''%AA%''
    AND Field1 NOT LIKE ''%BB%''
    AND Field1 NOT LIKE ''%00''';

set @sql=
    'SELECT 
        Field1
        ,Field2
     FROM tblAll
     WHERE '
     + @snippet + 
    'ORDER BY
        Field1;'

exec(@sql);

实际上,这是控制重复代码的最佳方法。 它允许您将其锁定在一个变量中,该变量可以插入到较大/许多SQL语句中。 这样,如果您将来需要对代码段进行更改,则只需要在一个位置进行更改,而不必查找包含代码的所有查询。

但它也使SQL引擎能够创建最快的代码以返回数据。

请记住...函数调用的处理成本可能非常高。 尽可能避免使用它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM