【问题标题】:SQL Function to ignore specific criteria忽略特定条件的 SQL 函数
【发布时间】:2017-02-02 16:37:34
【问题描述】:

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

例如:

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 sql-server function tsql


    【解决方案1】:

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

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

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

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

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

    但是,如果您坚持能够插入不会更改的代码 sn-ps。您可以尝试用不同的语言(如 Visual Basic、C 或 VBA 等)构建 SQL 代码,您可以在其中创建代码字符串。然后,您可以连接到您的 SQL 数据库并将生成的 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 语句中。这样,如果您以后需要对 sn-p 进行更改,您只需在一个地方进行更改,而不必寻找所有包含该代码的查询。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      相关资源
      最近更新 更多