动态执行SQL语句,拼接字符串,select中带有一个变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态执行SQL语句,拼接字符串,select中带有一个变量相关的知识,希望对你有一定的参考价值。

参考技术A --1. 构造使用IN子句的动态Transact-SQL方法进行编号查询

--a. 要查询的字段类型是数字型

--查询的值列表
DECLARE @idlist varchar(100)
SET @idlist='1,2,3'

--拼接并执行动态Transact-SQL语句
EXEC('SELECT * FROM tbname WHERE fdname IN('+@idlist+')')
GO

--b. 要查询的字段类型是字符型
--查询的值列表已经加上了字符串边界符
DECLARE @idlist varchar(100)
SET @idlist='''a'',''b''''a'',''c'''

--拼接并执行动态Transact-SQL语句
EXEC('SELECT * FROM tbname WHERE fdname IN('+@idlist+')')
GO

--查询的值列表没有字符串边界符
DECLARE @idlist varchar(100)
SET @idlist='a,b''a,c'

--由于是字段类型是,所以在拼接时,必须为其加上字符串边界符(')
DECLARE @s varchar(1000)
SET @s=''''
+REPLACE(REPLACE(@idlist,'''',''''''),',',''',''')
+''''

--拼接并执行动态Transact-SQL语句
EXEC('SELECT * FROM tbname WHERE fdname IN('+@s+')')
GO

/*=====================================================*/

--2. 使用LIKE或者PATINDEX进行编号查询
--查询的值列表
DECLARE @idlist varchar(100)
SET @idlist='1,2,3'

--查询
SELECT * FROM tbname WHERE CHARINDEX(','+RTRIM(fdname)+',',','+@idlist+',')>0
SELECT * FROM tbname WHERE PATINDEX('%,'+RTRIM(fdname)+',%',','+@idlist+',')>0
SELECT * FROM tbname WHERE ','+@idlist+',' LIKE '%,'+RTRIM(fdname)+',%'
GO

/*=====================================================*/

--3. 编号查询中常见的错误
--a. 最容易犯的错误:表达式充当表达式列表。
DECLARE @s varchar(100)
SET @s='1'
SELECT id,name FROM sysobjects WHERE id IN(@s)
/*--结果
id name
---------------- ------------
1 sysobjects
--*/

SET @s='1,2,3'
SELECT id,name FROM sysobjects WHERE id IN(@s)
/*--结果
服务器: 消息 245,级别 16,状态 1,行 3
将 varchar 值 '1,2,3' 转换为数据类型为 int 的列时发生语法错误。
--*/
GO

--b. 生成动态Transact-SQL语句时忽略了数据类型。
DECLARE @s varchar(100)
SET @s='U,S'
EXEC('SELECT id,name FROM sysobjects WHERE id IN('+@s+')')
/*--结果:
服务器: 消息 207,级别 16,状态 3,行 1
列名 'S' 无效。
服务器: 消息 207,级别 16,状态 1,行 1
列名 'U' 无效。
--*/
GO

--c. 忽略了比较的精确性问题。
--要查询的数据
DECLARE @t TABLE(col varchar(10))
INSERT @t SELECT '1'
UNION ALL SELECT '11'
UNION ALL SELECT '111'
UNION ALL SELECT '22'

--查询
DECLARE @s varchar(100)
SET @s='111,22'
SELECT * FROM @t WHERE CHARINDEX(col,@s)>0
/*--结果
col
----------
1
11
111
22
-*/
GO追问

非常感谢你。但是你能那我的那个例子说明下吗?

参考技术B 问题在第8行,
请参考第13行的写法。
第8行要写出 set @sql=@sql + N' select @i_i '追问

呃,首先要感谢下你帮我找问题,但是这个你试过了吗?貌似不行吧

jdbc中SQL语句拼接java变量

例如:
String sql = "select * from user where username=\'" + username + "\' and password =\'" + password + "\' ";
执行的时候自动就把变量转换为字符串类型,“”表示字符串,‘’是SQL的字符串和字符
两个双引号和变量拼接在一起,会吧变量转化为字符串
执行SQL的时候是这样的select * from user where username=\'\' and password =\'\';

练习

步骤:
1.创建数据库表

CREATE TABLE user(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32),
PASSWORD VARCHAR(32)
);

2.插入条记录

INSERT INTO user VALUES(null,\'zhangsan\',\'123\')
INSERT INTO user VALUES(null,\'lisi\',\'234\')
package cn.itcast.jdbc;

import cn.itcast.util.JDBCUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class JdbcDemo10 {
    public static void main(String[] args) {
        //1.键盘录入,接收用户名和密码
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = sc.nextLine();
        System.out.println("请输入密码");
        String password = sc.nextLine();

        //2.调用方法login,因为不是静态方法,所以要创建对象
        boolean flag = new JdbcDemo10().login(username, password);

        //3.判断结果,输出同语句
        if (flag){
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败,用户名或密码错误");
        }
    }

    /**
     * 登录方法
     */
    public boolean login(String username, String password) {
        if (username == null || password == null) {//如果有一个为空就不用去连接数据库,做操作
            return false;
        }
        //连接数据库是否判断成功
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            //1.获取数据库连接
            conn = JDBCUtils.getConnection();
            //2.定义SQL-------------------------------------拼接---------------------------------------------------
            String sql = "select * from user where username=\'" + username + "\' and password =\'" + password + "\' ";
            //3.获取执行SQL的对象
            stmt = conn.createStatement();
            //4.执行查询
            rs = stmt.executeQuery(sql);
            //5.判断
           /* if (rs.next()){//不用这样写rs.next()返回的就是true,false
                return true;
            }else {
                return false;
            }*/
            return rs.next();//如果有下一行返回true

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {//释放资源
            JDBCUtils.close(rs, stmt, conn);
        }

        return false;
    }
}

 

以上是关于动态执行SQL语句,拼接字符串,select中带有一个变量的主要内容,如果未能解决你的问题,请参考以下文章

java动态拼接sql语句并且执行时给sql语句的参数赋值

sql语句拼接

jdbc中SQL语句拼接java变量

动态拼接SQL 语句

Oracle [存储过程] 执行动态拼接SQL语句并返回结果??

mysql 字符串分割 和 动态执行拼接sql