SQL函数忽略特定条件

时间:2017-02-02 16:37:34

标签: sql sql-server function tsql

我经常在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

什么不对?

1 个答案:

答案 0 :(得分:0)

您尝试做的可能不是最佳方法。

您试图通过添加一些更容易编程的东西来缩短代码的速度。

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

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

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

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

就个人而言,如果您的目标是简化并为重复代码带来一些顺序,我会使用临时文件。

希望有所帮助。 :)

修改

Oooops,我们不要忘记动态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引擎能够创建最快的代码来返回数据。

请记住......函数调用对于处理来说可能非常昂贵。如果可能,请避免使用它们。