shanzm-2023年2月22日

0. 背景

代码中执行存储过程,参数是多个且不确定数量,期望SQL查询时使用该参数作为IN的筛选条件

比如说,具体参数@Ids="1,2,3,4",

期望在存储过程中,实现 select * from Table where id In @Ids

直接这样写会报错

(当然可以使用动态sql 进行拼接,但不需要这么做),而是将传递的参数分裂为单列的行记录!


1. 使用STRING_SPLIT函数

  • Sql Server在2016版本中支持使用STRING_SPLIT函数

    • 可以将字符串按照分隔符,切割成一个数据表
  • 若是低版本数据使用提示对象名 'STRING_SPLIT' 无效。

SELECT * FROM STRING_SPLIT('1,2,3,4,5', ',');

--结果:
value
-------------
1
2
3
4
5

2. 自定义分裂函数

  • 实现方式1:基于字符串操作

    • 将目标字符串末尾拼接上一个分隔符
    • 从字符串第一个位置开始查询分隔符在字符串中第一次出现的位置索引
    • 从左截取(第一个分隔符索引-1)长度的字符串,此外分裂出的第一个结果
    • 将目标字符串从第一个分隔符之前的替换为空
    • 循环上述2~4步骤
-- ======================================================
-- Author: shanzm
-- Create date: 2021年6月30日 15:52:02
-- Description: 将指定字符串按照指定的分裂符分裂为单列表
-- ======================================================
ALTER FUNCTION [dbo].[funGetSplitStr]
(
@Str VARCHAR(8000), --目标字符串,形如"a,b,c"
@StrSeprate VARCHAR(1) --分隔符,形如","
)
RETURNS @temp TABLE --返回表值变量,只有一列F1
(
F1 VARCHAR(100)
)
AS
BEGIN
DECLARE @ch AS VARCHAR(100);
SET @Str = @Str + @StrSeprate;
WHILE (@Str <> '')
BEGIN
SET @ch = LEFT(@Str, CHARINDEX(@StrSeprate, @Str, 1) - 1);
INSERT @temp
VALUES
(@ch);
SET @Str = STUFF(@Str, 1, CHARINDEX(@StrSeprate, @Str, 1), '');
END;
RETURN;
END;
  • 实现方式2:基于XML
-- ======================================================
-- Author: shanzm
-- Create date: 2021年6月30日 15:52:02
-- Description: 将指定字符串按照指定的分裂符分裂为单列表
-- ======================================================
CREATE FUNCTION dbo.funGetSplitStr2
(
@str varchar(1000),
@strSperate varchar(10)
)
RETURNS @tableVar TABLE
(
F1 VARCHAR(100)
)
AS
BEGIN
DECLARE @xmlstr XML;
--SET ARITHABORT ON;
SET @xmlstr = CONVERT(XML, '<root><v>' + REPLACE(@str, @strSperate, '</v><v>') + '</v></root>');
--SELECT @xmlstr; INSERT INTO @tableVar
SELECT F1 = N.v.value('.', 'varchar(100)') FROM @xmlstr.nodes('/root/v') N(v);
RETURN;
END;
GO --测试
SELECT * FROM funGetSpliterStr2('1.2.3','.') --结果 F1
---------
1
2
3 (3 行受影响)

3. 使用示例

代码中传递的参数@Ids="1,2,3,4",执行存储过程作为筛选条件

这里任意使用一个测试表Company,该表有一个Id字段,存储过程简单的演示了Ids字符串进行查询

  • 创建测试存储过程
CREATE PROCEDURE [dbo].[proTest]
@Ids VARCHAR(500)
AS
BEGIN
SELECT *
FROM dbo.Company
WHERE Id IN
(
SELECT F1 FROM dbo.funGetSplitStr(@Ids, ',')
);
END; EXEC dbo.proTest @Ids = '1,3';

T-SQL——将字符串转为单列的更多相关文章

  1. 【SQL】sql版Split函数。用于拆分字符串为单列表格

    功能与.net版string.Split函数类似,只不过.net返回的是数组,这个返回的是一个单列表格,每个拆分出来的子串占一行.可选是否移除空格子串和重复项.市面上类似的函数不算少,但大多都是在循环 ...

  2. 日期字符串转为java.sql.Date

    日期字符串转为java.sql.Date类型 问题引出:在将一个日期字符串通过sql语句,插入到数据表的日期字段(字段类型是DATE),时遇到一个问题,如何将一个日期字符串转成java.sql.Dat ...

  3. SQL SERVER 字符串函数 STRING_SPLIT()

    定义: STRING_SPLIT()函数根据指定的分隔符将字符串拆分为子字符串行. ※STRING_SPLIT 要求兼容性级别至少为 130. (即SSMS 2016及以上版本) ※级别低于 130 ...

  4. [LeetCode] String to Integer (atoi) 字符串转为整数

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  5. MSSQL Server数据库的四种连接方法和sql连接字符串

    MSSQL Server数据库的四种连接方法和sql连接字符串 分类: [ 03 ] C#(131) [ 07 ] SQL Server(68) [ 01 ] .NET(189) 今天用SQL Ser ...

  6. [C++] zlatlcv: ATL字符串转换辅助库。能很方便的将UTF-8字符串转为TCHAR等字符串

    作者:zyl910 如今,UTF-8字符串的使用频率越来越多了.但是在VC中,不能直接处理UTF-8字符串,得专门去写UTF-8与窄字符串.宽字符串.TCHAR字符串相互转换的代码.不仅费时费力,而且 ...

  7. sql 解析字符串添加到临时表中 sql存储过程in 参数输入

    sql 解析字符串添加到临时表中  sql存储过程in 参数输入 解决方法 把字符串解析 添加到 临时表中 SELECT * into #临时表   FROM dbo.Func_SplitOneCol ...

  8. sql2008 将行转为字符串, 将字符串转为行 互转

    --将行转为字符串 select stuff((select top 20 ','+ QQ from dl_QQ where uiid=1 order by tim desc for xml path ...

  9. json格式的字符串转为json对象遇到特殊字符问题解决

    中午做后台发过来的json的时候转为对象,可是有几条数据一直出不来,检查发现json里包含了换行符,造成这种情况的原因可能是编辑部门在编辑的时候打的回车造成的 假设有这样一段json格式的字符串 va ...

  10. DataTable转json字符串,jQuery.parseJSON()把json字符串转为标准的json对象格式

    1.string res = DataTableToJson.DataTable2Json(dt);讲DataTable转换为json字符串 http://www.365mini.com/page/j ...

随机推荐

  1. 我要涨知识——TypeScript 常见面试题(二)

    又是一个年底来了,好大一批人可能又准备跑路了,最近回家待产,翻了翻掘金和 CSDN 发现好多大佬都有大厂 Offer ,看着看着我心动了! 话不多说,赶紧开干,给自己整了一个前端面试小助手--微信小程 ...

  2. 一文带你快速入门 Go 语言微服务开发 - Dubbo Go 入门实践总结

    更多详细示例可直接访问 Dubbo 官网 或搜索关注官方微信公众号:Apache Dubbo 1. 安装Go语言环境 建议使用最新版 go 1.17 go version >= go 1.15 ...

  3. html网页图片加载失败的友好处理方式

    网络环境总是多样且复杂的,一张网页图片可能会因为网路状况差而加载失败或加载超长时间,也可能因为权限不足或者资源不存在而加载失败,这些都会导致用户体验变差,所以我们需要对图片加载失败时的情况进行一个弥补 ...

  4. Day30:ArrayList详解

    ArrayList 1.1 集合概述 当我们要存储多个数据时,固定长度的数组存储格式已经满足不了我们的需要了,且不能满足变化的需求: Java中集合类则可以解决我们的需求 特点:提供一种存储空间可变的 ...

  5. TornadoFx的TableView组件使用

    原文: TornadoFx的TableView组件使用 - Stars-One的杂货小窝 最近慢慢地接触了JavaFx中的TableView的使用,记下笔记总结 使用 1.基本使用 TornadoFx ...

  6. DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead

    // 引入mongoose模块 const mongoose = require('mongoose'); // 链接数据库 mongoose.set('useCreateIndex', true)  ...

  7. css images图片铺满 不变型 以及头像裁剪 属性

    一,图片的引入 background:url(img_flwr.gif); background-repeat:no-repeat; //平铺 二,图片的大小不不变形 background-size: ...

  8. test20230111考试总结 -2023寒图论专题

    前言 赛时得分情况: A B C D E F G H I \(\texttt{Total}\) \(\texttt{Rank}\) \(100\) \(100\) \(10\) \(58\) \(54 ...

  9. 踩坑纪实----tomcat部署前端服务器不能访问中文文件夹或中文文件名问题

    修改tomcat的server.xml文件(解决含有中文的文件.图片的不能下载.显示的问题): 找到下列配置信息在xml文件中的位置,添加黑体字部分的参数即可(disableUploadTimeout ...

  10. margin-left:auto的妙用

    问题描述 如上图所示,我们需要将上述三个标签右对齐,就像上图是要达到的效果,一般采用的方法是对每个标签设置margin-left这样就需要设置三个值. 当文字变长或者变成英文的时候又需要重新设置,否则 ...