如何将多行列查询结果合并到变量中并实现批量打印?
解决方案:处理多行多列结果并逐行打印
针对你想一次性处理fnBorrowerBooks返回的多行多列数据,并且能逐行打印合并内容的需求,这里有两种实用的SQL Server实现方法:
方法1:使用游标逐行处理
如果需要对每一行数据做单独的逻辑处理,游标是最直观的选择,能帮你逐行读取结果并打印:
-- 声明变量存储每行的字段值 DECLARE @title NVARCHAR(255), @dateBorrowed DATE, @dateReturned DATE -- 声明游标,指向函数返回的结果集 DECLARE book_cursor CURSOR FOR SELECT title, DateBorrowed, DateReturned FROM fnBorrowerBooks(@name, 'G3') -- 打开游标并循环读取 OPEN book_cursor FETCH NEXT FROM book_cursor INTO @title, @dateBorrowed, @dateReturned WHILE @@FETCH_STATUS = 0 BEGIN -- 打印当前行的合并内容,格式可自定义 PRINT CONCAT('书名:', @title, ' | 借阅日期:', @dateBorrowed, ' | 归还日期:', @dateReturned, ' ble ble ble') -- 读取下一行 FETCH NEXT FROM book_cursor INTO @title, @dateBorrowed, @dateReturned END -- 关闭并释放游标 CLOSE book_cursor DEALLOCATE book_cursor
方法2:使用STRING_AGG合并为带换行的字符串(SQL Server 2017+)
如果你的SQL Server版本是2017或更高,可以用STRING_AGG函数把所有行合并成一个包含换行符的字符串,然后一次性打印,代码更简洁:
DECLARE @result NVARCHAR(MAX) -- 用STRING_AGG合并每行内容,用CHAR(13)+CHAR(10)作为换行符 SELECT @result = STRING_AGG( CONCAT('书名:', title, ' | 借阅日期:', DateBorrowed, ' | 归还日期:', DateReturned, ' ble ble ble'), CHAR(13) + CHAR(10) ) FROM fnBorrowerBooks(@name, 'G3') -- 打印合并后的结果,会自动按行显示 PRINT @result
说明
- 两种方法都替代了你原来的三个
SET语句,直接从函数结果集中获取所有需要的字段 - 游标方法兼容性更好,适合所有SQL Server版本;
STRING_AGG方法代码更简洁,但需要版本支持 - 你可以根据实际需求调整
CONCAT里的内容格式,比如增减字段、修改分隔符等
内容的提问来源于stack exchange,提问作者SiwyJ
相关产品推荐
相关产品推荐

