原文:在论坛中出现的比较难的sql问题:17(字符分拆2)


最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。

1、存储过程

表A:

aid bid status

1    1   0

1    2   0

2    1   0

1    111  0

11   11   0

每条数据aid 联合bid 是唯一的,如何写存储过程进行批量操作。

传入[{aid:1,bid:2},{aid:11,bid:11}]

查询出下表数据:

aid bid status

1   2   0

11  11  0

建表语句:

CREATE TABLE A
(aid INT,
bid INT,
statuss INT
) INSERT A
SELECT 1,1,0 UNION ALL
SELECT 1,2,0 UNION ALL
SELECT 2,1,0 UNION ALL
SELECT 1,111,0 UNION ALL
SELECT 11,11,0
go

--1.字符串分拆函数
if exists(select * from sys.objects where name = 'f_splitSTR' and type = 'tf')
drop function dbo.f_splitSTR
go create function dbo.f_splitSTR
(
@s varchar(8000), --要分拆的字符串
@split varchar(10) --分隔字符
)
returns @re table( --要返回的临时表
col varchar(1000) --临时表中的列
)
as
begin
declare @len int set @len = LEN(@split) --分隔符不一定就是一个字符,可能是2个字符 while CHARINDEX(@split,@s) >0
begin
insert into @re
values(left(@s,charindex(@split,@s) - 1)) set @s = STUFF(@s,1,charindex(@split,@s) - 1 + @len ,'') --覆盖:字符串以及分隔符
end insert into @re values(@s) return --返回临时表
end
go CREATE PROC dbo.Pro_A
@param varchar(100)
AS declare @str varchar(100)
declare @sql nvarchar(4000) set @str = ''
set @sql = '' if OBJECT_ID('tempdb..#temp') is not null
drop table #temp --把拆分后的字段,插入到临时表
select LEFT(col,charindex(',',col)-1) as aid,
SUBSTRING(col,charindex(',',col)+1,LEN(col)) as bid
into #temp
from dbo.f_splitSTR(@param,';') t --生成动态语句
set @sql = 'SELECT *
FROM A
WHERE exists(select 1 from #temp
where #temp.aid = a.aid and #temp.bid = a.bid)' exec(@sql)
go exec Pro_A '1,2;11,11'
/*
aid bid statuss
1 2 0
11 11 0
*/

另一种方法:

if object_id('dbo.Pro_A') is not null
drop proc Pro_A
go create PROC dbo.Pro_A
@param varchar(100)
AS declare @str varchar(100)
declare @sql nvarchar(4000) set @str = @param
set @sql = '' set @str = replace(replace(replace(replace(REPLACE(@str,'[',''),']',''),'},{',';'),
'{',''),'}','') set @str = 'select '+replace(replace(@str,';',' union select '),':','=') if OBJECT_ID('tempdb..#temp') is not null
drop table #temp CREATE TABLE #temp
(aid INT,
bid INT) --把数据插入到临时表中
insert into #temp(aid,bid)
exec(@str) --生成动态语句
set @sql = 'SELECT *
FROM A
WHERE exists(select 1 from #temp
where #temp.aid = a.aid and #temp.bid = a.bid)' exec(@sql) --print @str
go exec Pro_A '[{aid:1,bid:2},{aid:11,bid:11}]'
/*
aid bid statuss
1 2 0
11 11 0
*/

发布了416 篇原创文章 · 获赞 135 · 访问量 94万+

最新文章

  1. StructureMap使用方法(转)
  2. 小甲鱼PE详解之输入表(导入表)详解(PE详解07)
  3. [GDI+] C# ImageDown帮助类教程与源码下载 (转载)
  4. IOS 技术层概览
  5. 国产CPU走到十字路口:谁来取代英特尔芯片?(少写了一个OpenPower)
  6. 日志收集之kafka
  7. Java接口和抽象类以及接口的意义,instanceof的利用
  8. js大图轮播和倒计时
  9. JavaScript中常见的10个BUG及其修复方法
  10. Palindromic characteristics CodeForces - 835D (区间DP,预处理回文串问题)
  11. 今天一起探讨shiro实现账户同一时刻session唯一
  12. Docker概念(二)
  13. [Shell]Bash变量:自定义变量 & 环境变量 & 位置参数变量 & 预定义变量
  14. 阿里云telnet 3306端口失败
  15. git branch 命令查看分支、删除远程分支、本地分支
  16. vue全家桶+Koa2开发笔记(2)--koa2
  17. RedHat 更新CentOS Yum源(转)
  18. Encapsulating Data 数据封装
  19. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑
  20. 洛谷2530(codevs2098)化工厂装箱员

热门文章

  1. 小程序运行报错navigateTo:fail page "pages/warn/warn" is not found
  2. Vulnerability Scanning Tools
  3. Hive小文件处理
  4. libfacedetection环境配置
  5. Windows下MariaDB数据库安装图文教程
  6. Qt编写气体安全管理系统1-项目框架
  7. Eureka客户端源码流程梳理
  8. SPSS 2019年10月17日 21:46:38 今日学习总结
  9. vue-cli3 + ts 定义全局方法
  10. 【MPEG】DVB / ATSC / ISDB区别