[英]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.