“数据库 Dynamic SQL(动态 SQL)”通常指在运行时拼接/生成并执行的 SQL 语句,不同数据库和语言里用法不太一样。下面按常见场景给你讲清楚。
静态 SQL:SQL 写死在代码里
SELECT * FROM user WHERE id = 1;
动态 SQL:SQL 在运行时才确定
'SELECT * FROM ' + table_name + ' WHERE id = ' + id;
DELIMITER $$
CREATE PROCEDURE dyn_sql(IN tbl VARCHAR(50))
BEGIN
SET @sql = CONCAT('SELECT * FROM ', tbl);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
调用:
CALL dyn_sql('user');
✅ 重点:
PREPARE:预编译EXECUTE:执行DECLARE
v_sql VARCHAR2(200);
v_count NUMBER;
BEGIN
v_sql := 'SELECT COUNT(*) FROM emp WHERE deptno = :1';
EXECUTE IMMEDIATE v_sql INTO v_count USING 10;
DBMS_OUTPUT.PUT_LINE(v_count);
END;
✅ 使用 USING 传参,安全!
DECLARE @sql NVARCHAR(500);
SET @sql = N'SELECT * FROM user WHERE id = @id';
EXEC sp_executesql @sql, N'@id INT', @id = 1;
✅ sp_executesql 支持参数,推荐方式
<select id="getUser">
SELECT * FROM user
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
✅ MyBatis 本质就是动态 SQL
sql = "SELECT * FROM user WHERE 1=1"
params = []
if name:
sql += " AND name = %s"
params.append(name)
cursor.execute(sql, params)
⚠️ 安全风险:SQL 注入
'DELETE FROM user WHERE name = ' + name
⚠️ 性能问题
PREPARE 可能影响性能✅ 适合:
❌ 不适合:
如果你能告诉我:
我可以直接给你对应的最优写法示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。