sql >> データベース >  >> RDS >> Sqlserver

SQL Server で関数を作成して実行する

    私なら:

    ALTER FUNCTION SearchProjects (
        @location NVARCHAR(50),
        @purpose NVARCHAR(50),
        @type NVARCHAR(50))
    RETURNS TABLE
    AS
    RETURN
    (
        SELECT  p.ProjectName, 
                p.Areas, 
                p.PaymentSystem, 
                p.ReceivedDate,    
                p.PropertyClassification, 
                p.ProjectImage,
                l.LocationName,
                pur.PurposeName,
                t.TypeName
        FROM dbo.Projects AS p 
        LEFT JOIN dbo.Locations AS l ON p.LocationID = l.ID      
        LEFT JOIN dbo.Purposes pur ON p.PurposeID = pur.ID 
        LEFT JOIN dbo.[Types] AS t ON p.TypeID = t.ID
        WHERE UPPER(ISNULL(l.LocationName,N'')) LIKE N'%' + UPPER(@location) + '%'
        AND UPPER(ISNULL(pur.PurposeName,N'')) LIKE N'%' + UPPER(@purpose) + '%'
        AND UPPER(ISNULL(t.TypeName,N'')) LIKE N'%' + UPPER(@type) + '%'
         )
    GO
    

    すべてのプロジェクトのみを返したい場合 の条件が満たされ、入力パラメーターの空の文字列はワイルドカードとして扱われます:

    SELECT * FROM dbo.SearchProjects('','',''); -- Returns all records
    
    SELECT * FROM dbo.SearchProjects('north','',''); -- Returns all records with LocationName containing 'north'
    SELECT * FROM dbo.SearchProjects('','research',''); -- Returns all records with PurposeName containing 'research'
    SELECT * FROM dbo.SearchProjects('','','closed'); -- Returns all records with TypeName containing 'closed'
    
    SELECT * FROM dbo.SearchProjects('north','research',''); -- Returns all records with LocationName containing 'north' and PurposeName containing 'research'
    

    これにより、入力パラメーター値をテーブル内のフィールド値と比較する際の大文字と小文字の区別もなくなります。 LEFT JOIN を引き続き使用します INNER JOIN の代わりに 一部のプロジェクト レコードに誤った LocationID、PurposeID、または TypeID 値が含まれている可能性がある場合に備えて。

    任意のプロジェクトを返却したい場合 入力パラメーターの条件が満たされている (少なくとも 1 つの入力パラメーターに値が含まれている場合、空の入力パラメーターをワイルドカードとして扱わない) 場合、AND を変更できます。 WHERE 内の OR への句 s と NULL を渡します 値を指定したくない入力パラメータ:

    ALTER FUNCTION SearchProjects (
        @location NVARCHAR(50),
        @purpose NVARCHAR(50),
        @type NVARCHAR(50))
    RETURNS TABLE
    AS
    RETURN
    (
        SELECT  p.ProjectName, 
                p.Areas, 
                p.PaymentSystem, 
                p.ReceivedDate,    
                p.PropertyClassification, 
                p.ProjectImage,
                l.LocationName,
                pur.PurposeName,
                t.TypeName
        FROM dbo.Projects AS p 
        LEFT JOIN dbo.Locations AS l ON p.LocationID = l.ID      
        LEFT JOIN dbo.Purposes pur ON p.PurposeID = pur.ID 
        LEFT JOIN dbo.[Types] AS t ON p.TypeID = t.ID
        WHERE UPPER(ISNULL(l.LocationName,N'')) LIKE N'%' + UPPER(@location) + '%'
        OR UPPER(ISNULL(pur.PurposeName,N'')) LIKE N'%' + UPPER(@purpose) + '%'
        OR UPPER(ISNULL(t.TypeName,N'')) LIKE N'%' + UPPER(@type) + '%'
         )
    GO
    
    
    SELECT * FROM dbo.SearchProjects('','',''); -- Returns all records
    
    SELECT * FROM dbo.SearchProjects('north',NULL,NULL); -- Returns all records with LocationName containing 'north'
    SELECT * FROM dbo.SearchProjects(NULL,'research',NULL); -- Returns all records with PurposeName containing 'research'
    SELECT * FROM dbo.SearchProjects(NULL,NULL,'closed'); -- Returns all records with TypeName containing 'closed'
    
    SELECT * FROM dbo.SearchProjects('north','research',NULL); -- Returns all records with LocationName containing 'north' or PurposeName containing 'research'
    

    NULL 入力パラメーターのいずれかに空の文字列を指定して関数を呼び出すと、すべてのレコードが返されるため、ここでは不要な入力パラメーターを指定する必要があります。

    SELECT * FROM dbo.SearchProjects('north','','');
    SELECT * FROM dbo.SearchProjects('north','research','');
    SELECT * FROM dbo.SearchProjects('north','','closed');
    


    1. 'in'演算子を使用したMySQLクエリ:なぜ引用符で異なる結果になるのですか?

    2. MVC4EntityFrameworkの多対多のカスタム結合テーブル名とスキーマ名

    3. ODP.NETは再配布可能ですか?

    4. mysqlを使用して結果セットから最後の4行をフェッチする最良の方法