2017-02-02 4 views
0

レコードを削除するために、WHERE文に繰り返し複数行のSQLスクリプトを書き込むことがよくあります。例えばSQL特定の条件を無視する関数

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

私はこれらの行を毎回追加する必要はありませんでした場合はミスしにくいだろう。

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 [email protected] 
     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 

しかし、私は重要な何かが欠けてる感じ:どのように私は私が?:代わりに

SELECT * 
FROM tblAll 
WHERE Field1 NOT LIKE Function 

これを行うために役立つだろう関数を作成することができますこれは私が現在持っているものです。この関数は、私がField1の有効な値と考えるものだけを提供します。今後のスクリプトは次のようにする必要があります。

Field1 = @Field1 

どうしますか?

答えて

0

あなたがしようとしていることは、最良のアプローチではないかもしれません。

プログラムの作成が簡単なコードを追加することで、コードの速度を短絡しようとしています。

大きなファイルがある場合、これは悲惨なことがあります。小さなファイルがある場合は、それはまだ面倒です。

あなたの反復的なものを最初に実行する一時テーブルを作成し、次にその小さな一時ファイルをあなたの他のコードに呼び出すほうが、より読みやすくなります。これにより、今後のコード作成者にとってより読みやすくなり、次のコードのサイズ(および複雑さ)が軽減されます。実行しているSQLのタイプによっては、tempテーブルコードを必要とする各SQLクエリの前に呼び出すことができるサブプロセスにテンポラリテーブルコードを配置することさえできるかもしれません。

まだ、必要な各クエリに余分なコードを追加するだけで、パフォーマンスが向上します。このようにして、SQLはデータを取得してそれをあなたに送り返す最も速い方法を決定することができます。 (たとえSQLコードが非常に嵩張っていても、多くの異なるクエリで同じスニペットを繰り返す必要があります)。

しかし、変更しないコードスニペットを挿入できると主張する場合。あなたは、コードの文字列を作成することができる別の言語(例えば、Visual Basic、C、またはVBAなど)でSQLコードを構築することができます。その後、SQLデータベースに接続し、生成されたSQLコードを送信して実行することができます。これにより、あらゆる種類のフランケンシュタインのコードを構築することができます。 (また、相互作用のフロントエンドを構築して、ユーザーがあらゆる種類のパラメータを追加できるようにすることもできます)。しかし、洞窟で遊ぶためのあらゆる種類の厄介な竜が存在することに注意してください。

個人的には、あなたの目標が単純化し、あなたの繰り返しコードに何らかの秩序を持たせることであるならば、私は一時ファイルに行きます。

ほんの少し役に立ちます。 :)

EDIT

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文に挿入できる1つの変数でそれをロックすることを可能にします。そうすれば、将来のスニペットの変更が必要な場合は、コードを持つすべてのクエリを検索するのではなく、1か所で変更を加えるだけで済みます。

しかし、SQLエンジンは、データを返すための最速のコードを作成することもできます。

覚えています...関数呼び出しは処理に非常にコストがかかる可能性があります。可能な場合は避けてください。