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 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";
}
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
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的方式。