惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
小众软件
小众软件
S
SegmentFault 最新的问题
人人都是产品经理
人人都是产品经理
博客园 - 【当耐特】
博客园 - 三生石上(FineUI控件)
C
Check Point Blog
S
Schneier on Security
Microsoft Azure Blog
Microsoft Azure Blog
N
Netflix TechBlog - Medium
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
罗磊的独立博客
有赞技术团队
有赞技术团队
V
V2EX
Y
Y Combinator Blog
博客园 - 叶小钗
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
F
Fortinet All Blogs
W
WeLiveSecurity
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Stack Overflow Blog
Stack Overflow Blog
The Cloudflare Blog
S
Security @ Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
MyScale Blog
MyScale Blog
Hugging Face - Blog
Hugging Face - Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
www.infosecurity-magazine.com
www.infosecurity-magazine.com
PCI Perspectives
PCI Perspectives
H
Heimdal Security Blog
Schneier on Security
Schneier on Security
Security Latest
Security Latest
AWS News Blog
AWS News Blog
月光博客
月光博客
Security Archives - TechRepublic
Security Archives - TechRepublic
Recent Announcements
Recent Announcements
Google DeepMind News
Google DeepMind News
博客园 - Franky
Cisco Talos Blog
Cisco Talos Blog
T
Threat Research - Cisco Blogs
M
MIT News - Artificial intelligence
T
Troy Hunt's Blog
N
News and Events Feed by Topic
Cloudbric
Cloudbric
Scott Helme
Scott Helme
云风的 BLOG
云风的 BLOG
Attack and Defense Labs
Attack and Defense Labs

博客园 - peak

windows 服务器时间同步失败处理方法 利用批处理自动创建schtasks系统任务 抓取网站编码信息及内容 在线调试利器Fiddler AutoResponse jquery跨域调用WCF Base-64 字符串中的无效字符 Ie7下鼠标滚轮失效 Android 笔记二(取得根目录权限) Android 笔记一 捕获asp.net ValidationSummary 控件消息。 - peak Rss的浏览器之痛 兼容IE,Firefox 图片即时显示 asp.net 中插入flash - peak - 博客园 迷茫 windows service 之访问权限 windows Service 之调试过程 比尔盖兹在某个大学毕业典礼上的演讲中,对毕业生提出十一项极为睿智的人生建议 MSDN上关于泛型的例子 泛型
Sql Split 函数
peak · 2009-12-27 · via 博客园 - peak

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
 
ENDif(@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的方式。