SQL Server 参数查询指南
参数查询是 SQL Server 中一种重要的查询技术,可以提高安全性、性能和代码的可维护性,以下是关于 SQL Server 参数查询的详细说明:

(图片来源网络,侵删)
参数查询的基本概念
参数查询使用参数(占位符)代替直接在 SQL 语句中嵌入值,这些参数在运行时才会被赋予具体的值。
参数查询的优势
- 安全性:防止 SQL 注入攻击
- 性能:可以重用执行计划
- 灵活性:可以轻松更改参数值而无需修改 SQL 语句
- 可维护性:代码更清晰,易于管理
实现参数查询的方法
1 使用参数化 SQL 字符串
-- 使用命名参数 DECLARE @sql NVARCHAR(MAX); DECLARE @CustomerID INT = 123; SET @sql = N'SELECT * FROM Customers WHERE CustomerID = @ID'; EXEC sp_executesql @sql, N'@ID INT', @ID = @CustomerID;
2 使用 ADO.NET 参数化查询
// C# 示例
using (SqlConnection connection = new SqlConnection(connectionString))
{
string sql = "SELECT * FROM Customers WHERE CustomerID = @ID";
SqlCommand command = new SqlCommand(sql, connection);
command.Parameters.AddWithValue("@ID", 123);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
// 处理结果...
}
3 使用存储过程
-- 创建存储过程
CREATE PROCEDURE GetCustomer
@CustomerID INT
AS
BEGIN
SELECT * FROM Customers WHERE CustomerID = @CustomerID;
END;
-- 执行存储过程
EXEC GetCustomer @CustomerID = 123;
4 使用 Entity Framework
// C# 示例
using (var context = new MyDbContext())
{
var customers = context.Customers
.Where(c => c.CustomerID == 123)
.ToList();
}
参数的数据类型
在 SQL Server 中,参数可以有以下数据类型:
- 标量类型(如 INT, VARCHAR, DATETIME 等)
- 表类型参数(Table-Valued Parameters)
- 用户定义类型(User-Defined Types)
表类型参数示例
-- 定义表类型
CREATE TYPE CustomerListType AS TABLE
(
CustomerID INT
);
-- 使用表类型参数
CREATE PROCEDURE GetCustomersFromList
@CustomerList CustomerListType READONLY
AS
BEGIN
SELECT c.*
FROM Customers c
INNER JOIN @CustomerList cl ON c.CustomerID = cl.CustomerID;
END;
-- 执行存储过程
DECLARE @CustomerList CustomerListType;
INSERT INTO @CustomerList VALUES (123), (456), (789);
EXEC GetCustomersFromList @CustomerList = @CustomerList;
最佳实践
- 始终使用参数化查询:避免字符串拼接 SQL 语句
- 指定参数数据类型:使用
@ParameterName DataType而不是@ParameterName - 使用 OUTPUT 参数:当需要从存储过程返回值时
- 考虑使用存储过程:对于复杂业务逻辑
- 验证输入参数:确保参数值在合理范围内
防止 SQL 注入
参数查询是防止 SQL 注入的最有效方法之一:
-- 不安全的方式(易受 SQL 注入) DECLARE @sql NVARCHAR(MAX); DECLARE @CustomerID NVARCHAR(50) = "123 OR 1=1"; SET @sql = 'SELECT * FROM Customers WHERE CustomerID = ' + @CustomerID; EXEC sp_executesql @sql; -- 安全的方式(参数化查询) DECLARE @sql NVARCHAR(MAX); DECLARE @CustomerID INT = 123; SET @sql = N'SELECT * FROM Customers WHERE CustomerID = @ID'; EXEC sp_executesql @sql, N'@ID INT', @ID = @CustomerID;
通过合理使用参数查询,可以构建更安全、更高效的 SQL Server 应用程序。

(图片来源网络,侵删)

(图片来源网络,侵删)
