SQL Server のユーザー定義関数には、スカラー関数とテーブル値関数 (インライン テーブル値関数、複数ステートメントのテーブル値関数) の 2 種類があります。
余談ですが、SQL Server のユーザー定義関数をどこに記述すべきかを知らない人もいるかもしれません。ここでは、Microsoft SQL Server Management Studio で、SQL Server ユーザーカスタム関数 データベースを作成するための具体的なニーズを拡張します。 (つまり、各ユーザー定義関数は特定のデータベースでのみ役立ちます)、次に、Programmability オプションを見つけて、展開して Function オプションを見つけます。特定の関数オプションについては、以下のマウス図を参照してください。右クリックして「追加」を選択します。
いわゆるスカラー関数 簡単に言うと、私にとって、返される結果は単なるスカラーです。
は次のように記述されます:
CREATE FUNCTION <Scalar_Function_Name, sysname, FunctionName> ( -- Add the parameters for the function here <@Param1, sysname, @p1> <Data_Type_For_Param1, , int> ) RETURNS <Function_Data_Type, ,int> AS BEGIN -- Declare the return variable here DECLARE <@ResultVar, sysname, @Result> <Function_Data_Type, ,int> -- Add the T-SQL statements to compute the return value here SELECT <@ResultVar, sysname, @Result> = <@Param1, sysname, @p1> -- Return the result of the function RETURN <@ResultVar, sysname, @Result>
CREATE FUNCTION GetSum ( @firstNum int, @secondNum int ) RETURNS int AS BEGIN -- Declare the return variable here DECLARE @result int -- Add the T-SQL statements to compute the return value here SELECT @result=@firstNum+@secondNum -- Return the result of the function RETURN @result
余談: SQLServer の場合、変数を宣言する方法は @変数名 を使用することであり、プログラミングに関連しています。そういえば、SQL Server の宣言方法は私たちにとって冗談です。最初に変数、次に型です。パラメータを渡すかどうかの方法は、実際にはプログラミング方法と同じです。パラメータがある場合、メソッドは次のようになります:
CREATE FUNCTION GetSum ( @firstNum int, @secondNum int )
パラメータがない場合は、括弧をそのままにしておきます。これは関数記述に関する私たちの理解と一致しています。
CREATE FUNCTION GetSum ( )
戻り方に関しては、プログラムのやり方とは異なります。 SQL Server 関数の戻り値の型は、関数名の前ではなく、関数名の括弧の後に配置されます。さらに、関数の戻り値の型には、RETURN の代わりに return キーワード RETURNS を使用する必要があります。
関数については、もちろん、いわゆる関数本体もあります。スカラー関数についても同様です。その関数本体は以下に含まれます:
AS BEGIN -- 函数体 END
関数本体で変数を宣言する必要がある場合は、DECLARE キーワードを使用して宣言する必要があります。関数本体のリターンはキーワード RETURN です。
これで、スカラー関数の例をデータベースに保存するには、Microsoft SQL Server Management Studio ツールで をクリックして 操作を実行する必要があります。この後、テーブル データのクエリと同様に、Query ウィンドウで結果をクエリできます。
使用方法はわかりやすいですが、オブジェクト[dbo]の名前は省略できないことと、[GetSum]関数の後の()を省略しないことに注意してください。不思議なことに、テーブル値関数の場合、オブジェクト名 [dbo] を記述しなくても正しく実行できます。
select [dbo].[GetSum]()
スカラー値のみを返すスカラー関数と比較して、インライン テーブル値関数はテーブル データを返します。もちろんテーブルデータはTable型です。
は次のように書きます:
CREATE FUNCTION <Inline_Function_Name, sysname, FunctionName> ( -- Add the parameters for the function here <@param1, sysname, @p1> <Data_Type_For_Param1, , int>, <@param2, sysname, @p2> <Data_Type_For_Param2, , char> ) RETURNS TABLE AS RETURN ( -- Add the SELECT statement with parameter references here SELECT 0 ) GO
CREATE FUNCTION [GetMoreThanSalary] ( @salary int ) RETURNS TABLE AS RETURN ( SELECT [FName],[FCity],[FAge],[FSalary] FROM [Demo].[dbo].[T_Person] Where [FSalary] > @salary )
スカラー関数の場合、関数本体は次の構造体に含まれます。
AS BEGIN -- 函数体 END
ただし、インライン テーブル値関数の場合、関数本体の構造は次のとおりです。インライン テーブル値関数は 1 つの SQL ステートメントのみを実行し、Table の結果を返します。
AS RETURN -- 函数体 END
テーブル値関数の実行方法は以下の通りです。
select [FName],[FCity],[FAge],[FSalary] from [dbo].[GetMoreThanSalary](8000)
この実行方法は通常のテーブルの実行方法と同じであることがわかります。テーブル値関数は、実際にはメモリ空間に格納された仮想テーブルと同等です。
複数ステートメントのテーブル値関数とインライン テーブル値関数はどちらもテーブル値関数であり、それらが返す結果はすべて Table 型です。名前が示すように、マルチステートメントのテーブル値関数は、複数のステートメントを通じてテーブル型のデータを作成できます。これは、インライン テーブル値関数とは異なります。インライン テーブル値関数の戻り結果は、関数本体の SELECT ステートメントによって決まります。複数ステートメントのテーブル値関数では、特定のテーブル型構造を指定する必要があります。つまり、返されたテーブルには、どのフィールドを返すかがすでに定義されています。したがって、テーブル データを作成するための複数のステートメントの実行をサポートできます。
CREATE FUNCTION <Table_Function_Name, sysname, FunctionName> ( -- Add the parameters for the function here <@param1, sysname, @p1> <data_type_for_param1, , int>, <@param2, sysname, @p2> <data_type_for_param2, , char> ) RETURNS <@Table_Variable_Name, sysname, @Table_Var> TABLE ( -- Add the column definitions for the TABLE variable here <Column_1, sysname, c1> <Data_Type_For_Column1, , int>, <Column_2, sysname, c2> <Data_Type_For_Column2, , int> ) AS BEGIN -- Fill the table variable with the rows for your result set RETURN END GO
ALTER FUNCTION DemoFun ( ) RETURNS @result TABLE ( name nvarchar(20), city nvarchar(20), age int, salary int ) AS BEGIN -- Fill the table variable with the rows for your result set insert into @result(name, city, age, salary) select FName,FCity,FAge,FSalary from dbo.T_Person where FSalary>8000 insert into @result(name, city, age, salary) values ('测试','China', 1, 0) RETURN END GO
题外话:可以看得出,多语句表值函数的返回结果是定义好表结构的虚拟表。这又跟标量函数一样了吧,只不过标量函数是返回一种类型的标量值而已。而且在多语句表值函数里面,你也会发现最后一句是RETURN。告诉执行程序,多语句表值函数已经执行完成。函数体结构跟标量函数的结构一样。对于类型放在变量后面这种方式确实需要好好转换一下观念。
RETURNS <@Table_Variable_Name, sysname, @Table_Var> TABLE ( -- Add the column definitions for the TABLE variable here <Column_1, sysname, c1> <Data_Type_For_Column1, , int>, <Column_2, sysname, c2> <Data_Type_For_Column2, , int> )
内容倒是不多,但是要熟练使用的话,还是需要在项目中多加使用才行。网上有一些网友总结出来的常用自定义函数大家可以收集积累,就像做项目一样,好的方法要形成所谓的开发库,帮助我们在下一个项目中复用。节省我们的开发时间,提高我们的工作效率。
以上がphp: SQL Serverのユーザー定義関数の型の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。