Sql Split 函数

Split 函数

CREATE FUNCTION [dbo].[Fun_Split] 
(
 
@field varchar(1000),
 
@ContainValue varchar(8000)
)
RETURNS varchar(4000)
AS
BEGIN
 
declare @strRet varchar(10)
 
declare @strTemp varchar(1000)
 
declare @StrSeprate varchar(10)
 
DECLARE @i int
 
set @StrSeprate=','
 
set @strRet='1'
 
SET @ContainValue=rtrim(ltrim(@ContainValue))
 
SET @i=charindex(@StrSeprate,@ContainValue)

 
WHILE (@i>=1)
 
BEGIN
  
set @strTemp=(left(@ContainValue,@i-1))
  
if(charindex(','+@strTemp+ ',',',' + @field + ',')=0)
  
begin
    
set @strRet='0'
  
end
  
SET @ContainValue=substring(@ContainValue,@i+1,len(@ContainValue)-@i)
  
if(@strRet='0')
    
begin
        
SET @i=0
    
end
  
else
    
begin
        
SET @i=charindex(@StrSeprate,@ContainValue)
    
end
 
END

  
if(@strRet='1')
  
begin
   
if(charindex(','+@ContainValue+',',','+@field+',')=0)
      
begin
        
set @strRet='0'
      
end
  
end
  
  
return @strRet
 
end

 以上函数有两个输入参数,@field 是需要判断的参数,@ContainValue是否被包含的值。

@field 中包含@ContainValue 的所有值时,返回1,否者返回0.

以下是实际中的使用:

tablename: test

id name value
1 A 1,2,3,4
2 B 2,3,4
3 C 3,4,5

 

SQL->select * from test where dbo.Fun_Split(value,'2,4')=1

查询结果:

id name value
1 A 1,2,3,4
2 B 2,3,4

 

以上是我最近工作中编写的一个函数,是为了解决一个特殊的查询的问题。其实,产生这样的问题是源于自己在设计表结构时不合理的缘故。

关于这样的问题,还有一个更简单的方法(这里不谈数据库结构的设计),就是在Visual studio IDE 中创建一个SqlServerProject ,编写一个如下的函数:

 

代码
[Microsoft.SqlServer.Server.SqlFunction]
    
public static string StrContain(string field,string value)
    {
        
bool isContain = true;
        
if (!string.IsNullOrEmpty(value))
        {
            
string[] values = value.Split(',');
            
foreach (var item in values)
            {
                
if ((',' + field + ",").IndexOf(',' + item + ','< 0)
                {
                    isContain 
= false;
                    
break;
                }
            }
        }
       
return isContain?"1":"0";
    }

 

 

启用sqlserver2005 的 Clr(我用的sqlserver2005 和 sqlserver2008).

 

代码
--启动clr
exec sp_configure 'show advanced options''1'
go
reconfigure
go
exec sp_configure 'clr enabled''1'
go
reconfigure
go
exec sp_configure 'show advanced options''1'
go

--关闭clr
exec sp_configure 'clr enabled''0'
go
reconfigure
go

 

select * from test where dbo.strContain(value,@input)=1;

查询的结果与上边的sql function一样的。

由于我考虑到客户服务器权限的问题,所以还是使用了 sql function的方式。

 

 

posted @ 2009-12-27 22:17  peak  阅读(937)  评论(0编辑  收藏  举报