You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在SQL Server中实现存储过程内执行SQL命令并调用存储过程

在SQL Server中实现带动态SQL的存储过程并调用

我来给你详细展示怎么在SQL Server里写一个能执行动态SQL的存储过程,还有后续的调用方法,顺便修正你原示例里的一个小问题,再补充更安全的写法:

1. 创建存储过程

你的原示例里直接把INT类型的@id和字符串拼接会触发类型转换错误,所以需要先把整数转成字符串类型。修正后的基础版本代码如下:

CREATE PROC ps_getPerson 
    @id INT 
AS 
BEGIN
    -- 声明用于存储动态SQL的变量
    DECLARE @query VARCHAR(MAX);
    -- 拼接动态SQL,先把INT类型的@id转换为字符串
    SET @query = ' SELECT * FROM Person WHERE id=' + CAST(@id AS VARCHAR(10));
    -- 执行拼接好的动态SQL
    EXEC(@query);
END;

更安全的参数化写法(防SQL注入)

直接拼接字符串存在SQL注入风险,推荐使用sp_executesql来执行参数化的动态SQL,这是更规范的写法:

CREATE PROC ps_getPerson 
    @id INT 
AS 
BEGIN
    DECLARE @query NVARCHAR(MAX);
    -- 定义带参数占位符的动态SQL语句
    SET @query = N'SELECT * FROM Person WHERE id = @ParamId';
    -- 执行参数化动态SQL,传入对应的参数
    EXEC sp_executesql @query, N'@ParamId INT', @ParamId = @id;
END;

2. 调用存储过程

存储过程创建完成后,你可以用两种方式调用它:

-- 推荐的命名参数调用方式,可读性更强
EXEC ps_getPerson @id = 1;

-- 简化的位置参数调用方式
EXEC ps_getPerson 1;

几个注意事项

  • 动态SQL虽然灵活,但SQL注入风险一定要重视,优先选择参数化的sp_executesql写法,而不是直接拼接字符串。
  • 确保执行这个存储过程的数据库账号,拥有对Person表的查询权限,否则会触发权限错误。

内容的提问来源于stack exchange,提问作者DM Ibtissam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:13:33