【C#】Sql Server 设置IN查询方法内的参数,固定参数、动态参数以及通过分隔含有逗号隔开的字符串转数据集

在平时使用sql语句查询时,in查询肯定少不了,多数用于一些数据统计或者测试类。in查询并不建议放到实际常用的查询列表里。
此篇文章主要简单聊聊,in查询方法内的参数设置方式,以及通过分隔函数将含有逗号隔开的字符串转为数据集进行查询

目录

  • 1、固定设置
  • 2、参数化设置动态
  • 3、函数分隔动态参数
    • 3.1、创建一个分割函数
    • 3.2、转数据集查询
  • 4、临时表方式
    • 4.1、动态执行sql
    • 4.2、数据添加到临时表

1、固定设置

在 SQL Server 中,你可以使用以下 SQL 语句来表示 IN 查询:

SELECT * FROM TableName WHERE ColumnName IN (value1, value2, value3)

其中,TableName 是你要查询的表名,ColumnName 是你要匹配的列名,value1、value2、value3 是你要匹配的值。你可以根据需要将多个值以逗号分隔放在括号中。

-- 查询名为customers的表中Name列值为'张三', '李四', '王五'的记录
SELECT * FROM customers WHERE Name IN ('张三', '李四', '王五')

这将返回符合条件的记录,满足 Country 列的值为 ‘张三’ 或 ‘李四’ 或 ‘王五’。

请注意,SQL 语句中的值需要根据列的数据类型进行正确的处理和引号包裹。对于字符串值,需要使用单引号或双引号将其括起来。对于其他数据类型,应根据其相应的语法规则进行处理。

2、参数化设置动态

在 SQL Server 中,我们可以使用参数化查询来动态设置 IN 查询条件。通过参数化查询,我们可以在查询中使用可变数量的参数值。

using System.Data.SqlClient;

string connectionString = "YourConnectionString";
string query = "SELECT * FROM TableName WHERE ColumnName IN (@Values)";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

    SqlCommand command = new SqlCommand(query, connection);
    
    // 可变数量的参数值
    List<int> parameterValues = new List<int> { 1, 2, 3, 4, 5 };
    
    // 构建参数化查询参数
    string parameterName = "@Values";
    string valueList = string.Join(",", parameterValues.Select((_, i) => $"{parameterName}{i}"));
    
    command.Parameters.AddWithValue(parameterName, valueList);
    
    // 执行查询
    SqlDataReader reader = command.ExecuteReader();
    
    while (reader.Read())
    {
        // 处理查询结果
    }
    
    reader.Close();
}

在C#编程里,在上述示例中,我们使用了一个包含参数值的 List(parameterValues)作为输入,该参数值将用于构建参数化查询。我们使用 string.Join 方法将参数名和索引拼接成一个逗号分隔的字符串,并将其作为参数值传递给 IN 子句。

注意在构建参数化查询时,为了防止 SQL 注入攻击,应使用参数化查询参数而不是直接将参数值插入到 SQL 查询字符串中。

注意:必须是通过程序进行参数化设置,否则查询无效

3、函数分隔动态参数

在 SQL Server 中,如果你想要将一个以逗号分隔的字符串转换为数据集供 IN 子句使用,你可以使用一些技巧来实现。

一种常见的方法是使用分割函数(Split Function)将字符串拆分为行,并将其作为临时表或表值函数的输入。然后,你可以在查询中使用这个临时表或表值函数来实现你的需求。

3.1、创建一个分割函数

创建一个分割函数(Split Function)。你可以创建一个自定义的分割函数,或者使用已有的分割函数,例如 STRING_SPLIT 函数(SQL Server 2016 及以上版本支持)。

CREATE FUNCTION dbo.SplitString
(
    @string NVARCHAR(MAX),
    @delimiter NVARCHAR(10)
)
RETURNS @result TABLE (Value NVARCHAR(MAX))
AS
BEGIN
    DECLARE @start INT,
            @end INT

    SET @start = 1
    SET @end = CHARINDEX(@delimiter, @string)

    WHILE @end > 0
    BEGIN
        INSERT INTO @result (Value)
        SELECT SUBSTRING(@string, @start, @end - @start)

        SET @start = @end + 1
        SET @end = CHARINDEX(@delimiter, @string, @start)
    END

    INSERT INTO @result (Value)
    SELECT SUBSTRING(@string, @start, LEN(@string) - @start + 1)

    RETURN
END

3.2、转数据集查询

使用分割函数将字符串转换为数据集,然后在查询中使用它。

DECLARE @inputString NVARCHAR(MAX) = 'value1,value2,value3'
DECLARE @delimiter NVARCHAR(10) = ','

SELECT t.* 
FROM TableName t
WHERE t.ColumnName IN (
    SELECT Value
    FROM dbo.SplitString(@inputString, @delimiter)
)

在上述示例中,我们首先创建了一个 SplitString 分割函数,其输入参数为字符串和分隔符。函数将字符串拆分为行,并以表格形式返回结果。

然后,我们声明了一个变量 @inputString 表示输入的以逗号分隔的字符串,以及一个变量 @delimiter 表示分隔符。在查询中,我们使用 SplitString 函数将字符串转换为数据集,然后将其与表中的 ColumnName 列进行比较,以实现 IN 查询的功能。

4、临时表方式

4.1、动态执行sql

在 SQL Server 中,你可以使用动态 SQL 来执行动态生成的 SQL 语句。动态 SQL 允许你在运行时构建和执行 SQL 语句,可以根据需要组合不同的查询条件。

DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM TableName WHERE ColumnName = @param'

DECLARE @param VARCHAR(100) = 'some_value'

EXEC sp_executesql @sql, N'@param VARCHAR(100)', @param

在上述示例中,我们声明了一个变量 @sql,其中存储了动态生成的 SQL 语句。这个 SQL 语句中使用了参数 @param,可以根据需要进行替换。

然后,我们声明了一个变量 @param 来指定参数的值。接下来,我们使用 sp_executesql 存储过程来执行动态 SQL 语句。该存储过程的第一个参数是动态 SQL 语句,第二个参数是定义参数的类型和名称的字符串,第三个参数是传入参数的实际值。

注意,使用动态 SQL 时应格外注意安全性,以防止 SQL 注入攻击。请确保输入的参数值正确经过验证和处理,或者考虑使用参数化查询来提高安全性。

4.2、数据添加到临时表

在 SQL Server 中,可以使用 INSERT INTO SELECT 语句将 EXEC sp_executesql 执行的结果集插入到临时表中。

-- 创建临时表
CREATE TABLE #TempTable (
    Column1 INT,
    Column2 VARCHAR(50)
)

DECLARE @sql NVARCHAR(MAX)
DECLARE @param INT = 1 -- 查询参数

-- 构建动态 SQL 语句
SET @sql = N'SELECT Column1, Column2 FROM YourTable WHERE Column3 = @param'

-- 执行动态 SQL 并将结果插入临时表
INSERT INTO #TempTable (Column1, Column2)
EXEC sp_executesql @sql, N'@param INT', @param

-- 查询临时表
SELECT *
FROM #TempTable

-- 删除临时表(可选)
DROP TABLE #TempTable

在上述示例中,首先创建了一个临时表 #TempTable,定义了与查询结果集匹配的列。然后,使用 sp_executesql 执行动态 SQL 语句,并将结果集通过 INSERT INTO SELECT 插入到临时表中。最后,可以通过查询 #TempTable 来查看结果集。

记得在使用完临时表后,根据需要及时删除它。可以使用 DROP TABLE 语句来删除临时表,以释放相关资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/35837.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于低代码平台打造的焙乐道销售支持系统

编者按&#xff1a;低代码平台说了那么多&#xff0c;在实际应用中又是怎样体现的它的种种优势呢&#xff1f;今天小编结合实际案例来说说。 本文是以最大的烘焙原料产商——焙乐道的销售支持系统为例子&#xff0c;进行说明。 客户说明&#xff1a;焙乐道是一家国际性集团公司…

Python一行命令搭建HTTP服务器并外网访问+-+内网穿透

文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 转载自远程内网穿透的文章&#xff1a;【Python】快速简单搭建HTTP服务器并公网访问「cpolar内网穿透…

CentOS Linux上安装JDK11、MySQL8.0、Minio等软件(rpm脚本模式)

本地环境&#xff1a;Windows 10家庭版 16G内存 512G硬盘 软件&#xff1a;VMWare WorkStation 16.0 FinalShell 4.0.1 一、下载必要软件包 下载软件均选择x86架构64位&#xff01;&#xff01;&#xff01;&#xff08;可根据自己的电脑配置选择&#xff09; CentOS Linu…

数字图像处理(三)

目录 实验六、图像分割方法 实验七、图像识别与分类 实验六、图像分割方法 一、实验目的 了解图像分割技术相关基础知识&#xff1b;掌握几种经典边缘检测算子的基本原理、实现步骤理解阈值分割、区域分割等的基本原理、实现步骤。理解分水岭分割方法的基本原理、实现方法。…

ModaHub魔搭社区:Zilliz Cloud快速开始教程(一)

目录 前提条件 创建 Collection 查看 Collection 插入数据 本教程涵盖以下 Zilliz Cloud 集群操作指南: 创建 Collection查看 Collection插入数据向量搜索、向量查询、通过 ID 获取 Entity删除 Entity删除 Collection 前提条件 在本文档中,我们将使用 Milvus 的 SDK。…

mysql单表查询,排序,分组查询,运算符,select,order by,group by

CREATE TABLE emp (empno int(4) NOT NULL, --员工编号ename varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,--员工名字job varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,--员工工作mgr int(4) NULL DEFAULT NU…

【计算机视觉】YOLOv8的测试以及训练过程(含源代码)

文章目录 一、导读二、部署环境三、预测结果3.1 使用检测模型3.2 使用分割模型3.3 使用分类模型3.4 使用pose检测模型 四、COCO val 数据集4.1 在 COCO128 val 上验证 YOLOv8n4.2 在COCO128上训练YOLOv8n 五、自己训练5.1 训练检测模型5.2 训练分割模型5.3 训练分类模型5.4 训练…

华为OD机试真题 Java 实现【快递投放问题】【2023 B卷 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出 一、题目描述 有N个快递站点用字符串标识&#xff0c;某些站点之间有道路连接。每个站点有一些包裹要运输&#xff0c;每个站点间的包裹不重复&#xff0c;路上有检查站会导致部分货物无…

博客质量分计算——发布 version 5

目录 1. 背景2. 质量分 version 52.1 version 4 存在问题分析2.2 version 5 改进2.3 消融分析2.3.1 正向积极得分消融实验2.3.2 正向累积得分单变量实验2.3.3 非高分文章消融实验 2.4 V4 和 V5 版本质量分分布对比 3. 总结4. 参考 1. 背景 博客质量分顾名思义是用于衡量一篇博…

MyBatis查询数据库(1)

前言&#x1f36d; ❤️❤️❤️SSM专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 经过前⾯的学习咱们 Spring 系列的基本操作已经实现的差不多了&#xff0…

企业为什么要做自动化测试?如何成功实施自动化测试?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 企业为什么需要自…

掌握Python文件操作的绝招:打造数据之径,揭开文件操作的神秘面纱

文章目录 前言文件的基本操作打开文件操作关闭文件操作对文件进行操作1&#xff09;只读文件操作read()readlines()readline()seek() 2&#xff09;只写文件操作3&#xff09;文件追加操作读写、追加读写操作1. r 模式打开文件2. w 模式打开文件3. a 模式打开文件 以二进制的形…

UDP客户端和服务器

UDP客户端&#xff0c;也就是首先主动发送数据的一方&#xff0c;也就是发起服务请求的一方。 UDP服务器&#xff0c;也就是首先等待接收数据&#xff0c;并对接收的数据进行处理&#xff0c;返回计算结果的一方&#xff0c;也就是提供服务的一方。 在下面实验中使用到的函数 …

Linux进度条

Linux进度条 一.基本概念1.回车和换行2.缓冲区2.实现倒计时 二.进度条 一.基本概念 1.回车和换行 回车&#xff1a;指光标移到该行的起始位置&#xff08;\r&#xff09;。 换行&#xff1a;换到下一行&#xff08;\n&#xff09;。 在c语音里\n将回车和换行相结合了。 2.缓冲…

存在CSRF漏洞的CMS练习

前言 作者简介&#xff1a;不知名白帽&#xff0c;网络安全学习者。 博客主页&#xff1a;不知名白帽的博客_CSDN博客-网络安全,CTF,内网渗透领域博主 网络安全交流社区&#xff1a;https://bbs.csdn.net/forums/angluoanquan CMS 链接&#xff1a;https://pan.baidu.com/s/13F…

Windows操作系统安全加固

Windows操作系统安全加固 一、安全加固基本思路1.1、安全基线1.2、系统信息审查 二、Windows安全配置加固2.1、漏洞修复——补丁安装2.2、漏洞修复——端口封禁2.2.1、windows高危端口加固实践——封禁135端口对外开放 2.3、安全配置加固——账号口令 一、安全加固基本思路 1.…

LinuxI2C应用编程——访问EEPROM

文章目录 介绍读芯片手册代码编译运行 阅读博文&#xff1a;LinuxI2C应用编程——I2C-Tools的使用 介绍 EEPROM (Electrically Erasable Programmable read only memory)&#xff0c;指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。 读芯片手册 首先按如图…

cmake操作目录

目录 cmake如何使用子目录 demo cmake生成build目录结构 如果指定子目录编译文件名字(binaryDir) 如果指定子目录编译的路径(binaryDir) 子目录相关的作用域 demo 子目录中定义project cmake如何使用子目录 如果项目比较小的话,我们将所有源码文件放到一个目录里面是没…

java环境搭建2-idea安装激活

windows环境装Java开发环境与idea安装激活 安装jdk安装idea激活idea新建项目开启Java学习 java环境搭建2-idea安装激活 之前安装了wslLinux子环境的Java开发环境,但是再许多地方没有人使用vscode进行Java开发,因为环境配置很麻烦,还有各种插件. windows环境装Java开发环境与ide…

django-vue-admin curd_demo 快速crud教程

django-vue-admin curd_demo 快速crud教程 快速CRUD开发教程&#xff1a;https://bbs.django-vue-admin.com/article/9.html 如何在 env.py 文件配置Mysql数据库&#xff1a;https://bbs.django-vue-admin.com/question/4.html 导入导出配置教程&#xff1a;https://bbs.djang…