SQL Server 动态构建 SQL 语句学习指南


SQL Server 中,动态构建 SQL 语句应用于各种场景,包括动态表名、列名,动态 WHERE 条件,以及动态分页、排序等。本文将详细计划如何在 SQL Server 中最佳实现动态 SQL 语句构建。

一、动态 SQL 的应用场景

  1. 动态表名或列名
  2. 动态 WHERE 条件
  3. 动态分页与排序
  4. 大量数据批量处理

二、动态 SQL 构建的实现方法

1. 使用 sp_executesql 可变 SQL

  • 优势:支持参数化,防止 SQL 注入,提高水缘程序的重用率。
sql 复制代码
DECLARE @sql NVARCHAR(MAX);
DECLARE @param NVARCHAR(MAX);
DECLARE @name NVARCHAR(50) = 'John';
DECLARE @minAge INT = 18;

SET @sql = 'SELECT * FROM Users WHERE 1=1';

IF @name IS NOT NULL
    SET @sql += ' AND Name = @name';
IF @minAge IS NOT NULL
    SET @sql += ' AND Age >= @minAge';

SET @param = '@name NVARCHAR(50), @minAge INT';
EXEC sp_executesql @sql, @param, @name = @name, @minAge = @minAge;

2. 使用 QUOTENAME() 保护对象名

  • 优势:防止为名称中的特殊字符或 SQL 注入。
sql 复制代码
DECLARE @tableName NVARCHAR(50) = 'Users';
DECLARE @sql NVARCHAR(MAX);

SET @sql = 'SELECT * FROM ' + QUOTENAME(@tableName);
EXEC sp_executesql @sql;

3. 使用 STRING_AGG() 进行快速列名拼接

  • 优势:加快列名、条件的加载。
sql 复制代码
DECLARE @columns NVARCHAR(MAX);

SELECT @columns = STRING_AGG(QUOTENAME(Name), ',')
FROM sys.columns
WHERE object_id = OBJECT_ID('Users');

DECLARE @sql NVARCHAR(MAX) = 'SELECT ' + @columns + ' FROM Users';
EXEC sp_executesql @sql;

4. 动态分页与排序

  • 优势:适合实现前端自定义分页和排序。
sql 复制代码
DECLARE @sql NVARCHAR(MAX);
DECLARE @orderColumn NVARCHAR(50) = 'Age';
DECLARE @orderType NVARCHAR(4) = 'DESC';

SET @sql = 'SELECT * FROM Users ORDER BY ' + QUOTENAME(@orderColumn) + ' ' + @orderType;
EXEC sp_executesql @sql;

5. 批量数据提升性能

  • 优势:减少多次调用的网络注入。
sql 复制代码
DECLARE @sql NVARCHAR(MAX);

SET @sql = 'INSERT INTO Users (Name, Age) VALUES ';

SELECT @sql += '(''' + Name + ''', ' + CAST(Age AS NVARCHAR) + '),'
FROM (VALUES ('John', 30), ('Alice', 25)) AS T(Name, Age);

SET @sql = LEFT(@sql, LEN(@sql) - 1);
EXEC sp_executesql @sql;

三、动态 SQL 构建的最佳实践

  1. 使用 sp_executesql,防止 SQL 注入
  2. QUOTENAME() 保护表名和列名
  3. 使用 STRING_AGG()FOR XML PATH,快速拼接列名
  4. 避免过长语句,分段处理或使用临时表
  5. 先输出再执行,便于调试
sql 复制代码
PRINT @sql;
EXEC sp_executesql @sql;

动态 SQL 构建是 SQL Server 开发中的重要技巧,提高了某些情况下的适配性和性能。通过其实现可以构建更加高效、安全和易事处理的 SQL 脚本。

相关推荐
百***490020 小时前
SQL Server查看数据库中每张表的数据量和总数据量
数据库·sql·oracle
代码or搬砖20 小时前
MyBatisPlus中的常用注解
数据库·oracle·mybatis
盼哥PyAI实验室20 小时前
MySQL 数据库入门第一课:安装、账户、库、表与数据操作详解
数据库·mysql
h***59331 天前
MySQL如何执行.sql 文件:详细教学指南
数据库·mysql
郑重其事,鹏程万里1 天前
键值存储数据库(chronicle-map)
数据库·oracle
Doro再努力1 天前
【MySQL数据库09】外键约束与多表查询基础
数据库·mysql
ss2731 天前
019:深入解析可重入互斥锁:原理、实现与线程安全实践
java·数据库·redis
O***Z6161 天前
三分钟内快速完成MySQL到达梦数据库的迁移
数据库·mysql
友友马1 天前
『QT』窗口 (一)
开发语言·数据库·qt
q***78371 天前
SQL实现md5加密方法
数据库·sql