当前位置: 首页 > 图文教程 > 数据库 > MYSQL > MSSQL和Mysql自定义函数与存储过程

MYSQL
MySQL 实用命令
Mysql 默认字符集设置方法(免安装版)
MySQL 数据库对服务器端光标的限制
MySQL UPDATE更新语句精解
Table ‘xxx’ is marked as crashed and should be repaired 错误解决方法参考
mysql 读写分离(基础篇)
mysql 读写分离(实战篇)
processlist命令 查看mysql 线程
MySQL 数据类型 大全
MySQL 密码设置
MYSQL代码 定期备份Mysql数据库
汇总整理MYSQL相关操作命令
MySQL 数据库两台主机同步实战(linux)
MSSQL 添加字段说明
MySQL 查询某个字段不重复的所有记录
mysql 设置默认的时间值
mysqlreport显示Com_中change_db占用比例高的问题的解决方法
解决mysql不能插入中文Incorrect string value
mysql从执行.sql文件时处理\n换行的问题
mysql 主从服务器的简单配置

MYSQL 中的 MSSQL和Mysql自定义函数与存储过程


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-30   浏览: 74 ::
收藏到网摘: n/a

mysql和mssql自定义都不带切割字符串的函数,例如在输入
(A,B,C),
我们需要得出一个列

数据
A
B
C

  这在系统自己种并不包含,需要自定义函数,先看看MSSQL的自定义函数:
CREATE    function    StrSplit(@c   varchar(2000),@split  varchar(2)=',')   
  returns   @t   table(col   varchar(100))   
  as   
    begin   
    
      while(charindex(@split,@c)<>0)   
        begin   
          insert   @t(col)   values   (substring(@c,1,charindex(@split,@c)-1))   
          set   @c   =   stuff(@c,1,charindex(@split,@c),'')   
        end   
      insert   @t(col)   values   (@c)   
      return   
    end

GO

 使用的时候
select * from  dbo.StrSplit('52,50,55',','))


即可。

   在MYSQL里面,我也希望能用自定义函数,但是,目前的版本并不支持返回table这种类型的函数,所以不得不考虑使用存储过程。
  首先,了解mysql创建临时表的语句:

set global log_bin_trust_function_creators = 1;
DELIMITER $$

DROP FUNCTION IF EXISTS `Myf`$$

CREATE DEFINER=`root`@`%` FUNCTION `Myf`() RETURNS varchar(50) CHARSET utf8
begin
return concat('-FUNCTION');
end$$

DELIMITER ;

然后看看使用:
SELECT Myf('MYF?');

然后是存储过程:
DELIMITER //

DROP PROCEDURE IF EXISTS split_string //
CREATE PROCEDURE split_string (
    IN input VARCHAR(2000)
    , IN `delimiter` VARCHAR(10) 

SQL SECURITY INVOKER
COMMENT 
'Splits a supplied string using using the given delimiter, 
placing values in a temporary table'
BEGIN
    DECLARE cur_position INT DEFAULT 1 ;
    DECLARE remainder VARCHAR(2000);
    DECLARE cur_string VARCHAR(1000);
    DECLARE delimiter_length TINYINT UNSIGNED;
    
    DROP TEMPORARY TABLE IF EXISTS SplitValues;
    CREATE TEMPORARY TABLE SplitValues (
        value VARCHAR(1000) NOT NULL PRIMARY KEY
    ) ENGINE=MyISAM;
    
    SET remainder = input;
    SET delimiter_length = CHAR_LENGTH(delimiter);
    
    WHILE CHAR_LENGTH(remainder) > 0 AND cur_position > 0 DO
        SET cur_position = INSTR(remainder, `delimiter`);
        IF cur_position = 0 THEN
            SET cur_string = remainder;
        ELSE
            SET cur_string = LEFT(remainder, cur_position - 1);
        END IF;
        IF TRIM(cur_string) != '' THEN
            INSERT INTO SplitValues VALUES (cur_string);
        END IF;
        SET remainder = SUBSTRING(remainder, cur_position + delimiter_length);
    END WHILE;
    
END //

DELIMITER ;

/* 
Tests 
*/

CALL split_string('Steve,Jan,Bobby,Jay,Kaj,Colin',',');

SELECT * FROM SplitValues;

CREATE TEMPORARY TABLE TestJoin (join_field VARCHAR(20) PRIMARY KEY) ENGINE=MEMORY;

INSERT INTO TestJoin VALUES ('Kaj'),('Colin');

SELECT tj.* FROM TestJoin tj 
INNER JOIN SplitValues sv
ON tj.join_field = sv.value;
//这个代码来自MYSQL官方,我没有验证