动态SQL 满足不固定的列查询(列的数量名称不固定 或 列的名称不固定两种情况)

本文介绍了如何使用动态SQL解决列数量和名称不固定的问题,以满足每月办公用品查询功能。当有新人加入时,系统会自动生成以新人名字为列的采购清单,并计算总金额和数量。难点在于人员数量和姓名的不确定性,通过CTE表达式创建临时表来解决。此外,还提及了另一种情况,即列名称不固定但数量固定,可以通过参数形式展示动态列头。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 需求:完成每月的办公用品查询功能。每当有一个新人在系统中采购办公用品,则增加已ta名字为一列的采购清单,并计算出合计金额数量。

PS:之前做的,现在有空整理出来。

问题难点:新增的人数,姓名等不固定,导致查询结果集列不确定。

解决关键点:利用动态SQL,先用CTE表达式遍历出所有新增的人员姓名作为临时表,再将每个姓名作为列显示出来。


USE [fanruan]
GO
/****** Object:  StoredProcedure [dbo].[office_statistics_02]    Script Date: 03/19/2019 11:41:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER proc [dbo].[office_statistics_02]
	@startdate datetime,
	@enddate datetime
as
begin

--Author:xzx Date:2018/12/27
if not object_id(N'Tempdb..#temp_office_test') is null
    drop table #temp_office_test
select 
C.NAME as 姓名,
CASE WHEN A.field0011 = '3866602892125882902' THEN '老厂' ELSE '新厂' END as 领用地点,
CASE WHEN D.PATH like '0000000100010001%' THEN '财务部'
	 WHEN D.PATH like '0000000100010002%' THEN '人事部'
	 WHEN D.PATH = '00000
### 可能的原因分析 当后台接口无数据返回且字段名未显示时,可能涉及以下几个方面: 1. **后端逻辑问题** 后台服务可能存在逻辑缺陷,在某些情况下未能正确组装并返回所需的数据结构。例如,如果后端使用的是 MyBatis 其他 ORM 工具,可能会因为 SQL 查询条件匹配动态 SQL 配置当而导致部分字段缺失[^3]。 2. **网络传输异常** 即使后端成功处理了请求,但在数据传输过程中可能出现中断其他异常情况,最终导致客户端接收到的内容为空符合预期[^1]。 3. **前端解析错误** 如果前端代码在处理 API 响应时存在漏洞(比如未考虑到 `success` 字段为 false 的场景),也可能造成看似“无数据”的现象。特别是对于 Axios 这样的 HTTP 客户端库来说,如果没有适当地配置响应拦截器来捕获特定业务状态下的失败情形,则容易忽略实际存在的问题。 --- ### 解决方案 #### 一、针对后端实现优化 - **完善接口设计** - 明确规定每种业务状态下应该返回哪些固定字段以及可选附加信息。 - 对于任何成功的调用都至少要包含基本元数据如 status/success 和 message 等通用属性以便调试定位问题所在位置。 - **采用灵活查询机制** 使用框架支持的功能定制化输出结果集中的名称表作为额外参数传递给数据库层执行检索操作前预设好期望获取的具体项目清单从而避免遗漏重要组成部分的情况发生。 ```sql -- 动态SQL示例 (MyBatis foreach标签) <select id="selectColumns" resultType="map"> SELECT <foreach collection="columns" item="column" open="" separator="," close=""> ${column} </foreach> FROM table_name WHERE condition = #{condition}; </select> ``` #### 二、改进前端交互方式 - **增强错误检测能力** 修改现有的 axios 请求流程加入更加细致全面的成功与否判定依据仅仅局限于 http code 而已还需要深入考察内部 payload 中携带的关键标志位是否满足既定标准才能真正确认整个事务顺利完成还是中途出现了差错需要重新发起尝试者是向用户提供友好的反馈通知他们当前所处状况如何解决办法是什么等等相关内容. ```javascript // Axios全局响应拦截器设置实例 axios.interceptors.response.use( response => { const { data } = response; if (!data.success) throw new Error(data.message || 'Request failed'); return data; // 返回解构后的纯数据对象供后续组件消费 }, error => Promise.reject(error?.response?.data ?? error) ); ``` - **控制并发请求数量** 实施防抖节流技术减少短时间内重复提交相同类型的询问次数防止服务器负载过高影响性能表现同时也降低了因乱序到达引起界面展示紊乱的风险概率提升用户体验满意度水平达到双赢效果[^2]. ```javascript let debounceTimer; function fetchData(params){ clearTimeout(debounceTimer); // 清除之前的定时器以防叠加累积效应产生副作用 debounceTimer = setTimeout(() => { axios.get('/api/data', { params }) .then(res=>console.log('Fetched:',res)) .catch(err=>alert(`Error occurred:${err}`)); },500); // 设置延迟时间为半秒即0.5s调整数值大小视具体需求而定即可获得最佳平衡点兼顾效率与稳定性两者兼得之妙计也哉! } ``` --- ### 总结说明 综上所述,通过前后两端协同合作可以从根源上去除此类隐患的发生几率极大程度提高系统的健壮性和可靠性让每一位使用者都能享受到流畅便捷的服务体验过程之中感受到科技带来的便利之处无穷尽矣!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值