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

在平时使用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 parameterValues = new List { 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 语句来删除临时表,以释放相关资源。