SELECT *FROM UCML_Organize WHERE ClassCode LIKE '%'+@OID+'%'
一般用like实现模糊查询,大概就这样写吧!
但是,@OID万一不是一个值了?而是多个值了,那么我们应该去怎么写了。
我当时想的,是不是like后面可以加一个in来了。想了想,sql也没这种写法呀。果不其然报错了!
SELECT *FROM UCML_Organize WHERE ClassCode LIKE IN('%'+@OID+'%')
后面想到了那就用OR条件来写吧,也就是这样将多个值用OR一直连起来。
SELECT *FROM UCML_Organize WHERE ClassCode LIKE '%'+@OID+'%' OR ClassCode LIKE '%'+@OID+'%'
OR ClassCode LIKE '%'+@OID+'%'
先把它给拼接起来
SELECT STUFF((SELECT 'OR ClassCode LIKE ''' + ClassCode+'%'' ' FROM UCML_Organize FOR XML PATH('')),1,2,'')
这一段查询出来的结果就是这个样子
到这里当时我就想直接将 图一where后面的条件直接给换成这个一段也就是这样
SELECT *FROM UCML_Organize WHERE STUFF((SELECT 'OR ClassCode LIKE ''' + ClassCode+'%'' ' FROM UCML_Organize FOR XML PATH('')),1,2,'')
然后它给报错了,如下图
后面发现它其实是 SELECT *FROM UCML_Organize WHERE ''的形式的。查询出来的那一段还是字符格式。前端倒是直接可以用eval来解决。数据库不行呀,只有用exec(字符串)来执行。
因此就想将where条件后面的OR那一堆条件给查询出来,然后把前面那一段sql变成字符串。最后
再把两端给拼接起来在用exe来执行就好了。
--sql1装基础语句
declare @sql1 nvarchar(1000)
--sql2根据动态生成的or条件后缀
declare @sql2 nvarchar(1000)
--获取不属于该单位类型的最底层单位,及部门
declare @sql3 nvarchar(max)
--最终执行的存储过程语句
declare @sqlMAX nvarchar(max)
set @sql1='SELECT CONVERT(VARCHAR(50),UCML_OrganizeOID)+'','' FROM UCML_Organize WHERE (';
set @sql2=(SELECT STUFF((SELECT 'OR ClassCode LIKE ''' + ClassCode+'%'' ' FROM UCML_Organize WHERE ORG_FLG=1 AND UCML_OrganizeOID NOT IN(SELECT ParentOID FROM UCML_Organize WHERE ORG_FLG=1)
AND UCML_OrganizeOID NOT IN(SELECT SYS_ORG FROM BBTB_DWJBXX WHERE DWSSLX=@DWLX) FOR XML PATH('')),1,2,''))
set @sql3=@sql1+@sql2+') FOR XML PATH('''')'
exec(sql3)