我经常在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
什么不对?
答案 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引擎能够创建最快的代码来返回数据。
请记住......函数调用对于处理来说可能非常昂贵。如果可能,请避免使用它们。