首页 > 数据库 >[转][SQL Server] 如果想动态 In 应该怎么写?

[转][SQL Server] 如果想动态 In 应该怎么写?

时间:2024-03-15 17:44:56浏览次数:31  
标签:-- sql Server 参数 SQL 动态 Id

来自:TONGYI Lingma  

在 SQL Server 中,如果你需要动态生成 IN 子句来匹配一组不确定数量的值,你不能直接在预编译的 SQL 语句中使用一个动态的列表。但你可以通过以下几种方法实现动态 IN 查询:

方法一:参数化查询(适用于少量可变参数)

对于少量(通常数据库驱动程序允许的最大参数数限制内)可变的输入值,可以创建一个存储过程或动态SQL语句,并为每个可能的IN条件值传递一个参数。例如:

CREATE PROCEDURE GetItemsByDynamicIds
    @ids NVARCHAR(MAX)
AS
BEGIN
    DECLARE @sql NVARCHAR(MAX);

    SET @sql = N'SELECT * FROM YourTable WHERE Id IN (' + REPLACE(@ids, ',', ', ') + ')';
    -- 或者确保安全性和正确性,可以使用参数化查询结合表值参数:
    -- SET @sql = N'SELECT * FROM YourTable WHERE Id IN (SELECT Id FROM @IdsTable)';

    EXEC sp_executesql @sql, N'@IdsTable dbo.IdsTableType READONLY', @IdsTable = @ids;
END

这里假设有一个表值类型(比如 dbo.IdsTableType)用于存储多个ID。

 

方法二:临时表或表变量

如果你有一大堆值要处理,可以先将这些值插入到临时表或表变量中,然后用这个临时结构进行JOIN操作:

DECLARE @TempTable TABLE (Id INT);

-- 动态插入值到临时表
INSERT INTO @TempTable (Id)
VALUES (...), (...); -- 这里根据实际值动态插入

-- 使用临时表进行查询
SELECT yt.*
FROM YourTable yt
JOIN @TempTable tt ON yt.Id = tt.Id;

 

方法三:动态SQL与字符串拼接(需注意SQL注入风险)

在一些场景下,特别是当值集合从应用程序端动态获取时,可以构建包含所有值的字符串并在运行时拼接成SQL语句执行:

DECLARE @ids NVARCHAR(MAX) = N'1, 2, 3'; -- 这个应该来自外部数据源并确保安全
DECLARE @sql NVARCHAR(MAX);

SET @sql = N'SELECT * FROM YourTable WHERE Id IN (' + @ids + ')';

EXEC sp_executesql @sql; 

请注意:这种方法存在SQL注入的风险,务必对用户提供的任何输入进行严格的验证和清理,或者使用参数化查询结合上述提到的表值参数的方法。

 

总结

推荐使用参数化查询结合表值参数的方法,因为它既能够防止SQL注入,又能处理大量动态的输入值。在处理动态SQL时,始终牢记SQL注入的安全问题,并尽可能采用最安全的做法。

标签:--,sql,Server,参数,SQL,动态,Id
From: https://www.cnblogs.com/z5337/p/18075921

相关文章

  • MySQL的四个事务隔离级别有哪些?各自存在哪些问题?
    前言大家应该都知道mysql的事务有四个隔离级别,但是他们分别是什么隔离级别并且会带来什么问题呢?接下来我为大家一一揭晓,通过图解的方式方便大家理解。一、读未提交(ReadUncommitted)1、这个是隔离级别最低的。2、顾名思义,可以看出来就是一个事务可以读取另外一个未提交事务......
  • 连接MySQL报错,is not allowed to connect to this MySQL server
    问题描述:        本机装的MySQL数据库,本机可以正常连接,其他机器访问报错,isnotallowedtoconnecttothisMySQLserver,防火墙等其他策略均配置没问题。  解决方案:    出现该问题的原因是,MySQL数据库只允许自身所在的本机器连接,不允许远程连接。1、......
  • PgSql jsonb类型查询
    十年河东,十年河西,莫欺少年穷学无止境,精益求精json函数及操作,详情请参考:http://www.postgres.cn/docs/12/functions-json.html表结构如下:createtablechargeing(idUUIDprimarykeynotnull,heartjsonbnotnull,createtimetimestampnotnull);createindex......
  • idea项目mapper.xml中的SQL语句黄色下划线去除
    问题描述当我们使用idea开发java项目时,经常会与数据库打交道,一般在使用mybatis的时候需要写一大堆的mapper.xml以及SQL语句,每当写完SQL语句的时候总是有黄色下划线,看着很不舒服。解决方案:修改idea的配置Editor->Inspections打开配置页面后,在中间视窗找到sql的>点击下......
  • mysql备份脚本
    !/bin/bash备份路径db_backup_path="/data/backup"备份的数据库db_name=("live_net")用户名db_user="root"密码db_pass="mysql@abc.net"gzip文件解压缩密码gz_des_pass="fff@20210326"压缩文件前缀prefix=“credit"日志路径log_path=&quo......
  • sql case when, Exist ,group by ,聚合
    selectcm.heatno,cm.lotheatno,cm.heatorder,max(cm.cutdate)cutdate,cm.cutdimensiona,cm.cutdimensionb,cm.length,sum(cm.weight/1000)weight,sum(cm.weightw......
  • RHEL 9 / Rocky Linux 9 上安装 MySQL
    MySQL 是热门的开源关系数据库(RDBMS)由Oracle开发和维护。它提供SQL(结构化查询语言)语法,用于小型和大规模企业处理数据库。在这篇文章中,我们将解释如何在RHEL9或RockyLinux9上安装MySQL数据库服务器。我们将介绍MySQL8.0和最新版本的MySQL8.3.0的安装步骤。1.......
  • EI期刊复现:面向配电网韧性提升的移动储能预布局与动态调度策略程序代码!
    适用平台:Matlab+Yalmip+Cplex/Gurobi/Mosek程序提出一种多源协同的两阶段配电网韧性提升策略。在灾前考虑光伏出力不确定性与网络重构,以移动储能配置成本与负荷削减风险成本最小为目标对储能的配置数量与位置进行预布局;在灾后通过多源协同运行与移动储能的动态调度最小化负荷......
  • MySQL为什么使用B+树
    在线查看数据格式链接:DataStructureVisualizationhttps://www.cs.usfca.edu/~galles/visualization/Algorithms.html 常见数据结构:    1.数组:数组是内存中一块连续的内存空间,定义一个数组对象,就需要先指定数组的大小,当存储数据的大小大于定义的数组大小,就需......
  • iis使用动态 IP 限制
     使用动态IP限制(下载页面提示已停用)https://www.iis.net/downloads/microsoft/dynamic-ip-restrictionshttps://learn.microsoft.com/en-us/iis/manage/configuring-security/using-dynamic-ip-restrictions特征动态IP限制模块包括以下主要功能:根据并发请求数......