数据库中的自定义表值函数

看到别人写的函数,一开始看不懂,于是在网上找资料,原来是表值函数,感觉又学到了,满满的充实感,摘录如下:

表值函数

表值函数和标量值函数的不同是 表值函数是返回一个Table类型  Table类型相当与一张存储在内存中的一张虚拟表.

表值函数的语法:

CREATE FUNCTION [ schema_name. ] function_name 
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type 
    [ = default ] } 
    [ ,...n ]
  ]
)
RETURNS TABLE
    [ WITH <function_option> [ ,...n ] ]
    [ AS ]
    RETURN [ ( ] select_stmt [ ) ]
[ ; ]

现在来写一个比较实用的表值函数..

写一个切割字符串的表值函数


 1 --------------------------这个函数用来切割字符串的-----------------
 2 --函数的参数  第一个是要切割的字符串 第二个是要以什么字符串切割
 3 CREATE FUNCTION Split(@Text NVARCHAR(4000),@Sign NVARCHAR(4000))
 4 RETURNS  @tempTable TABLE(id INT IDENTITY(1,1) PRIMARY KEY,[VALUE] NVARCHAR(4000))
 5 AS
 6 BEGIN
 7     DECLARE @StartIndex INT                --开始查找的位置
 8     DECLARE @FindIndex  INT                --找到的位置
 9     DECLARE @Content    VARCHAR(4000)    --找到的值
10     --初始化一些变量
11     SET @StartIndex = 1 --T-SQL中字符串的查找位置是从1开始的
12     SET @FindIndex=0
13     
14     --开始循环查找字符串逗号
15     WHILE(@StartIndex <= LEN(@Text))
16     BEGIN
17         --查找字符串函数 CHARINDEX  第一个参数是要找的字符串
18         --                            第二个参数是在哪里查找这个字符串
19         --                            第三个参数是开始查找的位置
20         --返回值是找到字符串的位置
21         SELECT @FindIndex = CHARINDEX(@Sign,@Text,@StartIndex)
22         --判断有没找到 没找到返回0
23         IF(@FindIndex =0 OR @FindIndex IS NULL)
24         BEGIN
25             --如果没有找到者表示找完了
26             SET @FindIndex = LEN(@Text)+1
27         END
28         --截取字符串函数 SUBSTRING  第一个参数是要截取的字符串
29         --                            第二个参数是开始的位置
30         --                            第三个参数是截取的长度
31         [email protected]@StartIndex 表示找的的位置-开始找的位置=要截取的长度
32         --LTRIM 和 RTRIM 是去除字符串左边和右边的空格函数
33         SET @Content = LTRIM(RTRIM(SUBSTRING(@Text,@StartIndex,@[email protected])))
34         --初始化下次查找的位置
35         SET @StartIndex = @FindIndex+1
36         --把找的的值插入到要返回的Table类型中
37         INSERT INTO @tempTable ([VALUE]) VALUES (@Content) 
38     END
39     RETURN
40 END

这个函数的作用就是类似.Net中的string类的Split方法

现在来测试这个函数

这个函数返回的是Table类型   所以可以用下面的语法来调用


SELECT * FROM dbo.Split(‘a,b,c,d,e,f,g‘,‘,‘)

得到的结果

这个函数还是比较实用的..

原网址:http://www.cnblogs.com/chenliang0724/archive/2008/09/26/1298849.html

时间: 2024-12-18 12:22:22

数据库中的自定义表值函数的相关文章

Java学习总结(十八)——MySQL数据库(4)MySQL数据库中的视图,函数,存储过程中常见循环

一.MySQL存储过程中常见的循环1.while循环:WHILE.....DO.....END WHILE例1:创建存储过程(求1+2+.......+num的和):创建成功,进行调用:显示结果:2.REPEAT循环: REPEAT.........UNTLL END REPEAT例2:创建存储过程:创建完成,调用存储过程:显示结果:3.LOOP循环:LOOP END LOOP 例3:创建存储过程:创建成功,调用存储过程:显示结果:二.MySQL中的视图1.概念:有结构(有行有列),但没有结果(

mysql导入数据库中的存储过程和函数出现错误的解决办法

mysql导入数据库中的存储过程和函数出现错误的解决办法 调用一个远程拷贝的本地Mysql的储存过程 报错:[Err] 1449 - The user specified as a definer ('repl'@'192.168.1.%') does not exist  解决想法: 凭借以前经常见到的[email protected]报错,给root赋值所有权限: grant all privileges on *.* to [email protected]"%" identif

java中调用数据库中的存储过程和函数

public static void main(String[] args) {         Connection conn =getConnection(url,user, pwd);         System.out.println("数据连接成功");         CallableStatement cs=null;         try         {    //调用数据库中的存储过程              cs = conn.prepareCall(&q

数据库自定义表值函数Split(@LongStr, @SplitStr, @IsDistinct )

CREATE FUNCTION [dbo].[F3_Split](@LongStr VARCHAR(MAX),@SplitStr VARCHAR(100),@IsDistinct BIT)RETURNS @RTable TABLE(ID INT IDENTITY PRIMARY KEY,ShortStr VARCHAR(MAX))AS BEGIN IF ISNULL(@LongStr,'')='' --表达式为空或NULL直接返回空表  RETURN IF ISNULL(@SplitStr,''

oracle 数据库学习3 --oracle 数据库中常使用的函数

1.字符函数: ASCII(X) -->返回X字符的ASCII码 concat(x,y)-->将y连接到X上输出 select concat(first_name,last_name) from customers; INITCAP(x) 将x中每个单词的首字母大写 INSTR('namename','e',1,2)  -->从'namename'开始的第一个字母开始找'e'第二次出现的位置; LENGTH(x) 获取X字符串的长度: LOWER(x) 将x中的字母转换为小写: UPPE

Matlab中所有自定义的函数

Functions By Category | Alphabetical List Language Fundamentals Entering Commands ans Most recent answer clc Clear Command Window diary Save Command Window text to file format Set display format for output home Send cursor home iskeyword Determine wh

EntityFramework Core 2.0自定义标量函数两种方式

前言 上一节我们讲完原始查询如何防止SQL注入问题同时并提供了几种方式.本节我们继续来讲讲EF Core 2.0中的新特性自定义标量函数. 自定义标量函数两种方式 在EF Core 2.0中我们可以将方法映射到数据库中的标量函数,我们可在LINQ中调用此方法并会被正确翻译成SQL语句,这为编写数据访问层的开发人员提供了一个很棒的功能来创建一个方法并在其上应用DbFunction特性即可.该属性会将静态CLR方法映射到数据库函数,以便可以在LINQ查询中使用此方法.默认情况下,数据库函数中的CLR

在Oracle电子商务套件版本12.2中创建自定义应用程序(文档ID 1577707.1)

在本文档中 本笔记介绍了在Oracle电子商务套件版本12.2中创建自定义应用程序所需的基本步骤.如果您要创建新表单,报告等,则需要自定义应用程序.它们允许您将自定义编写的文件与Oracle电子商务套件提供的标准种子功能分离.在向您的环境应用修补程序或执行升级时可以保留自定义设置. 自定义数据和索引表空间默认为APPS_TS_TX_DATA和APPS_TS_TX_IDX. 注意:当没有活动的修补程序周期时,应在运行文件系统上执行本文档中描述的过程. 也可以按照此过程更正先前创建的不使用AD Sp

自定义el函数

1.1.1 自定义EL函数(EL调用Java的函数) 第一步:创建一个Java类.方法必须是静态方法. public static String sayHello(String name){ return "Hello " + name; } 第二步:提供一个tld文件.(tld文件标签库文件.放置在WEB-INF 下) 在tld文件中定义: <!-- 自定义EL函数 --> <function> <!-- 函数名 --> <name>s