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

SQL Server - 引用符で囲まれていない定数を DATEPART のように関数に渡す

    UDF の入力を小さな値のセットに実際に制限することはできません (私の知る限りでは)。

    次のような列挙値の表を作成することをお勧めします:

    CREATE TABLE MyEnumTable (DatePartID tinyint, DatePartValue char(2))
    GO
    INSERT MyEnumTable(DatePartID, DatePartValue)
    SELECT 1, 'yy'
    UNION
    SELECT 2, 'mm'
    UNION
    SELECT 3, 'dd'
    UNION
    SELECT 4, 'hh'
    GO
    
    CREATE FUNCTION MyDatePart(@IntervalType tinyint)
    RETURNS varchar(255)
    AS
    BEGIN
    IF NOT EXISTS (SELECT * FROM MyEnumTable WHERE DatePartID = @IntervalType)
       RETURN 'Invalid IntervalType'
    
    --Do your stuff
    DECLARE @DatePartvalue char(2)
    SELECT  @DatePartValue = DatePartValue
    FROM    MyEnumTable
    WHERE   DatePartID = @IntervalType
    
    RETURN @DatePartValue
    END
    
    GO
    
    --Check it out
    SELECT dbo.MyDatePart(3), dbo.MyDatePart(12)
    

    もちろん、私の例は単純化しすぎていますが、おわかりいただけたでしょうか。

    また、set ステートメントで udf を使用する予定がある場合は、パフォーマンス上の理由から関数をテーブル値関数にすることを検討してください。ここで、さまざまな関数タイプのパフォーマンスへの影響についてブログを書きました:

    http://thehobt.blogspot.com/2009 /02/scalar-functions-vs-table-valued.html



    1. MYSQLテーブルに新しい列を追加しようとしたときに接続が失われました

    2. 何千もの挿入があるCodeigniterのinsert_batch()にレコードがありません

    3. 定期的なイベント、SQLクエリ

    4. グループごとに固定数の行を選択するにはどうすればよいですか?