Arduin ESP32+epaper(电子墨水屏)时钟相册制作教程
Arduin ESP32 +epaper(电子墨水屏)时钟相册制作教程
- 🔖epaper(电子墨水屏)采用的是:合宙1.54“ 电子墨水屏(e-paper)
- 📍相关篇《Arduino框架下ESP32/ESP8266+合宙1.54“ 电子墨水屏(e-paper)驱动显示示例》
- 🌿电子屏幕相关资料:
https://www.waveshare.net/wiki/1.54inch_e-Paper_Module - 🪓图片取模教程和工具介绍:https://www.waveshare.net/wiki/Image2Lcd%E5%9B%BE%E7%89%87%E5%8F%96%E6%A8%A1%E6%AD%A5%E9%AA%A4
- 📌同类型的,微雪品牌的相关资料参考(提供了包含约50种规格的电子墨水屏(e-paper)):
https://www.waveshare.net/wiki/1.54inch_e-Paper_Module - 🔱个人采用的是esp32测试,esp8266应该也可以的。
🔖有关数据管理和更新,可以参考以下内容:
- 📌通过网页实现图片数据管理,可以参考《Arduino ESP32当作FTP服务器 访问SD卡文件》
- 📌《Arduino ESP32 Web服务器SD卡文件管理》


🛠图片取模制作
- 🔧制作软件:
Image2Lcd - 🌿图片尺寸要求:200X200像素点

- 📍图片素材获取源:
https://icons8.com/icons/set/raspberry-pi - 📍图片素材获取源2:
https://fontawesome.com/icons?d=gallery&p=2
🍭字模数据转BIN文件
- 🔨需要借助c代码,使用C编译器指令或
VSCode将字模数组转bin文件。200X200像素的图片去取模转BIN文件后的大小都是5KB。
#include <stdio.h>
const unsigned char gImage_yun[5000] = {图片字符数组}
int main()
{size_t size = sizeof(gImage_yun[0]);size_t count = sizeof(gImage_yun) / size;FILE *fp = fopen("gImage_yun.bin", "wb");if (fp == NULL){printf("Failed to open file.\n");return 1;}size_t elements_written = fwrite(gImage_yun, size, count, fp);if (elements_written != count){printf("Failed to write data to file.\n");fclose(fp);return 1;}fclose(fp);printf("Data written successfully.\n");return 0;
}

- 🔖如何配合
CodeRuner插件使用: 

-
🔖如果不使用该插件的话,可以在终端命令行中输入
gcc .\Font.c命令按回车,然后执行.\a.exe命令回车。(前提是安装了C编译器并且添加到了系统环境变量中)

-
🔖运行成功后,会自动生成:
.bin文件。

-
🌿将生成的
.BIN文件拷贝到工程项目的data文件夹内。如果使用SD卡配合文件系统也是可以的。
📘LittleFS文件系统配置
- ⚡Arduino平台的所有的文件系统(SPIFFS/LittleFS/FatFS文件系统),仅针对ESP32,仅支持Arduino IDE
1.8.x.x版本下使用,Arduino IDE 2.x.x不支持!!!(ESP8266支持Arduino IDE 2.x.x版本) - 📍esp32文件系统上传插件下载地址:
https://github.com/lorol/arduino-esp32fs-plugin/releases - 📍ESP8266 littlefs文件系统下载地址:
https://github.com/earlephilhower/arduino-littlefs-upload/releases
📗LittleFS系统文件上传说明
- ✨首次上传程序时,需要注意,删除全部内容:

- 🔱上传LittleFS系统文件




🍭电子墨水屏注意事项
- 🔱支持局刷的屏幕,注意使用的时候不能一直用局刷对屏幕进行刷新,需要在做几次局刷之后,对屏幕进行一次全刷清屏。否则会造成屏幕显示效果异常。
- 🔱注意屏幕不能长时间上电,在屏幕不刷新的时候,要将屏幕设置成睡眠模式,或者进行断电处理。否则屏幕长时间保持高电压状态,会损坏膜片,无法修复。
- 🔱使用墨水屏的时候,建议刷新时间间隔至少是180s, 并且至少每24小时做一次刷新,如果长期不使用墨水屏的话,要将墨水屏刷白存放。(具体储存环境需求参考数据手册)
- 🔱屏幕进入睡眠模式之后,会忽略发送的图片数据,只有重新初始化才能正常刷新。
📘电子墨水屏显示内容说明
- 🌿对于黑白款的电子墨水屏,内容支持全刷和局刷。在使用过程中如果需要切换不同的刷新方式时,需要先停止使用SPI总线(
SPI.endTransaction()),推荐在刷完显示内容后,调用epd.Sleep()之后,停与屏幕的SPI通讯。再次刷新屏幕的时候,再进行一次初始化。
⛳图片更新方式
- 🌿通过Arduino IDE
1.8.x.x版本,只需选择上传littleFS进行文件上传即可,但是还是需要在当前工程目录下有data目录,才可更新显示内容素材。


- 图片数据文件上传后,进行复位,打开串口,如果文件系统初始化成功,读取到文件会打印出来:

📝主程序代码:
/*** @filename : epd1in54-demo.ino* @brief : 1.54inch e-paper display demo* @author : Yehui from Waveshare** Copyright (C) Waveshare September 5 2017** Permission is hereby granted, free of charge, to any person obtaining a copy* of this software and associated documnetation files (the "Software"), to deal* in the Software without restriction, including without limitation the rights* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell* copies of the Software, and to permit persons to whom the Software is* furished to do so, subject to the following conditions:** The above copyright notice and this permission notice shall be included in* all copies or substantial portions of the Software.** ESP32引脚定义:* BUSY -> 13 || RES -> 12 || DC -> 14 || CS -> 27 || SCL -> 18 || SDA -> 23 ||*黑字:COLORED 白色:UNCOLORED支持局刷的屏幕,注意使用的时候不能一直用局刷对屏幕进行刷新,需要在做几次局刷之后,对屏幕进行一次全刷清屏。否则会造成屏幕显示效果异常。
注意屏幕不能长时间上电,在屏幕不刷新的时候,要将屏幕设置成睡眠模式,或者进行断电处理。否则屏幕长时间保持高电压状态,会损坏膜片,无法修复。
使用墨水屏的时候,建议刷新时间间隔至少是180s, 并且至少每24小时做一次刷新,如果长期不使用墨水屏的话,要将墨水屏刷白存放。(具体储存环境需求参考数据手册)
屏幕进入睡眠模式之后,会忽略发送的图片数据,只有重新初始化才能正常刷新。*/#include <SPI.h>
#include "epd1in54.h"
#include "epdpaint.h"
#include "imagedata.h"#include <WiFi.h> // esp32开发板自带库
#include <time.h>
#include <sys/time.h>
#include <Ticker.h>
#include <LittleFS.h> // 如果使用LittleFS
#include "FS.h"
#include "esp_task_wdt.h"
//#include "RTClib.h" //by Adafruit库来实现软件RTC时间
#define TZ 8 // (utc+) TZ in hours
#define DST_MN 0 // use 60mn for summer time in some countries
#define TZ_MN ((TZ)*60)
#define TZ_SEC ((TZ)*3600)
#define daylightOffset_sec 3600#define LED_PIN 2
#define COLORED 0
#define UNCOLORED 1#define bitmapSize 5000#define PIC_TIME 75#define Conter_MAX 10 //图片最多显示数量const char* ssid = "MERCURY_D268G";//填写wifi信息
const char* password = "pba5ayzk";
uint8_t Conter=0;
String pic1[10];/*** Due to RAM not enough in Arduino UNO, a frame buffer is not allowed.* In this case, a smaller image buffer is allocated and you have to * update a partial display several times.* 1 byte = 8 pixels, therefore you have to set 8*N pixels at a time.*/
unsigned char image[1024];
Paint paint(image, 0, 0); // width should be the multiple of 8
Epd epd;Ticker Refresh; //图片切换
Ticker UPDATE; //时间显示
Ticker blinker;//unsigned long time_start_ms;
//unsigned long time_now_s;
const char * weekday[] = { "7", "1","2", "3","4", "5", "6"};
uint8_t blinkerPace = 1; //seconds
static bool TOGGLE = false;
//bool Refresh_flag = true;void listDir(fs::FS &fs, const char * dirname, uint8_t levels);
void Picture_Refresh();
void UP_Date_Data();void blink() {digitalWrite(LED_PIN, !digitalRead(LED_PIN));
}void setup() {// put your setup code here, to run once:Serial.begin(9600);Serial.println();pinMode(LED_PIN, OUTPUT);WiFi.mode(WIFI_STA);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.println("Connecting to WiFi...");}// rtc.begin(DateTime(F(__DATE__), F(__TIME__)));//不联网,使用编译时间// rtc.adjust(DateTime(2024,3, 9, 23, 12, 10));Serial.println("Connected to WiFi");if (!LittleFS.begin()) { // LittleFS初始化Serial.println("LittleFS Mount Failed");} else {Serial.println("LittleFS Mounted Successfully");}configTime(TZ_SEC, daylightOffset_sec , "ntp3.aliyun.com", "ntp.ntsc.ac.cn", "1.cn.pool.ntp.org");//asia.pool.ntp.org//rtc.begin(DateTime(F(__DATE__), F(__TIME__)));Refresh.attach(PIC_TIME, Picture_Refresh); // 每隔60秒执行一次blinker.attach(blinkerPace, blink);//lut_partial_update if (epd.Init(lut_full_update) != 0) {Serial.print("e-Paper init failed");return;}epd.ClearFrameMemory(0xFF); // bit set = white, bit reset = blackepd.DisplayFrame();epd.ClearFrameMemory(0xff); // bit set = white, bit reset = blackepd.DisplayFrame();delay(2000);paint.SetRotate(ROTATE_0);//屏幕旋转 指定显示区域paint.Clear(UNCOLORED);//白色区域内容显示epd.SetFrameMemory(gImage_bird);//gImage_rp / gImage_birdepd.DisplayFrame();epd.SetFrameMemory(gImage_bird);epd.DisplayFrame();epd.Sleep();SPI.endTransaction();delay(2000);UPDATE.once(5,UP_Date_Data); //时间更新一次// epd.Reset();Serial.println("Display complete");listDir(LittleFS, "/", 1);// 禁用硬件看门狗esp_task_wdt_init(10 * 1000 * 1000,false); // 参数为0表示不启用看门狗}void loop() {// put your main code here, to run repeatedly:
}void listDir(fs::FS &fs, const char * dirname, uint8_t levels){Serial.printf("Listing directory: %s\r\n", dirname);File root = fs.open(dirname);if(!root){Serial.println("- failed to open directory");return;}if(!root.isDirectory()){Serial.println(" - not a directory");return;}File file = root.openNextFile();while(file){if(file.isDirectory()){Serial.print(" DIR : ");Serial.println(file.name());if(levels){listDir(fs, file.path(), levels -1);}} else {Serial.print(" FILE: ");pic1[Conter]=file.name();Serial.print( pic1[Conter].c_str());Serial.print("\tSIZE: ");Serial.println(file.size());Conter++;}file = root.openNextFile();Conter %=Conter_MAX;}
}void Picture_Refresh()
{// 读取文件内容到缓冲区static uint8_t buffer_imge[bitmapSize]; // 确保这里定义的缓冲区足够大以容纳字模数据static uint8_t CNT=0;File bitmapFile;String pic_name = "/"+ pic1[CNT++];Serial.println(pic_name.c_str());//打印当前要显示图片的名称bitmapFile = LittleFS.open(pic_name, "r");CNT %= Conter;if (!bitmapFile) {Serial.println("Failed to open bitmap file for reading!");return;}else
{
//Serial.print("Reading" );
uint16_t len = bitmapFile.size();
// uint32_t start = millis();while(len){size_t toRead = len;if(toRead > bitmapSize){toRead = bitmapSize;}bitmapFile.read(buffer_imge, toRead);len -= toRead;}// uint32_t end = millis() - start;
// Serial.printf("5000 bytes Reading in %u ms\r\n", end);epd.ClearFrameMemory(0xff); //刷白epd.DisplayFrame();epd.ClearFrameMemory(0xff); // bit set = white, bit reset = blackepd.DisplayFrame();delay(800);paint.SetRotate(ROTATE_0);epd.SetFrameMemory(buffer_imge);epd.DisplayFrame();epd.SetFrameMemory(buffer_imge);epd.DisplayFrame();epd.Sleep();SPI.endTransaction();}UPDATE.once(60,UP_Date_Data);//调用时间更新
}void UP_Date_Data()
{char buff[32];time_t now = time(nullptr);struct tm* timeinfo;timeinfo = localtime(&now); // 转换为本地时间strftime(buff, sizeof(buff), "%c", timeinfo);Serial.println(buff);Serial.printf(PSTR("20%02d-%02d-%02d %02d:%02d:%02d\r\n"),\(timeinfo->tm_year)%100,timeinfo->tm_mon+1,timeinfo->tm_mday,\timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);String Date_data =String(timeinfo->tm_mon+1)+"-"+String(timeinfo->tm_mday) +" "+String(timeinfo->tm_hour)+":"+String(timeinfo->tm_min)+" T"+weekday[timeinfo->tm_wday];String Time_data = String(timeinfo->tm_hour)+":"+String(timeinfo->tm_min);//"20"+String((timeinfo->tm_year)%100)+"-"+ +":"+String(timeinfo->tm_sec);Serial.println(Date_data);Serial.println(Time_data);delay(800);epd.ClearFrameMemory(0xFF); // bit set = white, bit reset = blackepd.DisplayFrame();epd.ClearFrameMemory(0xFF); // bit set = white, bit reset = blackepd.DisplayFrame();paint.SetRotate(ROTATE_0);paint.SetWidth(200);paint.SetHeight(26);paint.Clear(UNCOLORED);//白底paint.DrawStringAt(0, 3,Date_data.c_str(), &Font24, COLORED);//UNCOLORED:白色epd.SetFrameMemory(paint.GetImage(), 0, 174, paint.GetWidth(), paint.GetHeight()); epd.DisplayFrame();epd.SetFrameMemory(paint.GetImage(), 0, 174, paint.GetWidth(), paint.GetHeight()); epd.DisplayFrame();epd.Sleep();}
📘工程源码:
链接: https://pan.baidu.com/s/1jd7jHhtjmozOxTA38kuGsw?pwd=dngy
提取码: dngy
- 🔖此文章仅作为个人学习探索知识的总结,不作为他人或引用者的理论依据,由于学识所限,难免会出现错误或纰漏,欢迎大家指正。
相关文章:
Arduin ESP32+epaper(电子墨水屏)时钟相册制作教程
Arduin ESP32 epaper(电子墨水屏)时钟相册制作教程 🔖epaper(电子墨水屏)采用的是:合宙1.54“ 电子墨水屏(e-paper)📍相关篇《Arduino框架下ESP32/ESP8266合宙1.54“ 电子墨水屏(e-paper)驱动显…...
Django模型层(附带test环境)
Django模型层(附带test环境) 目录 Django模型层(附带test环境)连接数据库Django ORM在models.py中建表允许为空指定默认值数据库迁移命令 开启测试环境建表语句补充(更改默认表名)数据的增加时间数据的时区 多表数据的增加一对多多对多 数据的删除修改数据查询数据查询所有数据…...
(AliyunAIACP17)知识点:神经网络(深度学习)分析
摘要: 案,详细阐述了神经网络的实现步骤,并提供了相应的代码示例。此外,文章还涵盖了神经网络中的技巧与实践、性能优化与测试,以及常见问题与解答。最后,对神经网络在深度学习中的应用前景进行了展望。 …...
基于 HBase Phoenix 构建实时数仓(1)—— Hadoop HA 安装部署
目录 一、主机规划 二、环境准备 1. 启动 NTP 时钟同步 2. 修改 hosts 文件 3. 配置所有主机间 ssh 免密 4. 修改用户可打开文件数与进程数(可选) 三、安装 JDK 四、安装部署 Zookeeper 集群 1. 解压、配置环境变量 2. 创建配置文件 3. 创建新…...
XS2185:八通道PSE控制器产品
八通道PSE控制器产品-XS2185 芯片特性 八通道PSE 支持标准PD供电 支持非标PD供电 每个端口功率最大30W 12位端口电流监测 12位电源电压监测 支持直流负载断开检测 支持LED供电状态指示 支持过流保护 支持短路保护 Sifos基本测试通过 32-PIN…...
Selenium WebDriver API 中涉及的一些常用方法和类
Selenium WebDriver API 是 Selenium 提供的一组方法和类,用于控制浏览器和操作 Web 元素。这些 API 提供了丰富的功能,包括但不限于: 1. **查找元素**:通过不同的定位方式(如ID、Class Name、XPath等)在页…...
OJ_复数集合
题干 C实现 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <queue> #include <string> using namespace std;struct Complex {int re;int im;//构造函数Complex(int _re, int _im) {//注意参数名字必须不同re _re;im _im;} };//结构体不支…...
【学一点RISC-V】ACLINT(高级核心本地中断控制器)文档
RISCV架构 ACLINT文档 ACLINT原文档:https://github.com/riscv/riscv-aclint/blob/main/riscv-aclint.adoc 在这里进行了翻译以及校对,仅供参考,不正确的地方欢迎指出 1、介绍 【此 RISC-V ACLINT 规范定义了一组内存映射设备,这…...
grafana table合并查询
注:本文基于Grafana v9.2.8编写 1 问题 默认情况下table展示的是一个查询返回的多个field,但是我想要的数据在不同的metric上,比如我需要显示某个pod的读写IO,但是读和写这两个指标存在于两个不同的metirc,需要分别查…...
编程笔记 html5cssjs 007 文章排版 颜真卿《述张长史笔法十二意》
编程笔记 html5&css&js 007 文章排版 颜真卿《述张长史笔法十二意》 一、代码二、解释 这段代码定义了一个古文展示页面的结构和样式,同时本文内容也是书法爱好者的珍贵资料。 一、代码 <!DOCTYPE html> <html lang"zh-CN"> <hea…...
Yolov8模型用torch_pruning剪枝
目录 🚀🚀🚀订阅专栏,更新及时查看不迷路🚀🚀🚀 原理 遍历所有分组 高级剪枝器 🚀🚀🚀订阅专栏,更新及时查看不迷路🚀🚀…...
C++字符串操作【超详细】
零.前言 本文将重点围绕C的字符串来展开描述。 其中,对于C/C中字符串的一些区别也做出了回答,并对于C的(string库)进行了讲解,最后我们给出字符串的不同表达形式。 开发环境: VS2022 一.字符串常量跟字…...
Ps:画笔工具
画笔工具 Brush Tool是 Photoshop 中最常用的工具,可广泛地用于绘画与修饰工作之中。 快捷键:B ◆ ◆ ◆ 常用操作方法与技巧 1、熟练掌握画笔工具的操作对于使用其他工具也非常有益,因为 Photoshop 中许多与笔刷相关的工具有类似的选项和操…...
【鸿蒙 HarmonyOS 4.0】弹性布局(Flex)
一、介绍 弹性布局(Flex)提供更加有效的方式对容器中的子元素进行排列、对齐和分配剩余空间。容器默认存在主轴与交叉轴,子元素默认沿主轴排列,子元素在主轴方向的尺寸称为主轴尺寸,在交叉轴方向的尺寸称为交叉轴尺寸…...
Java 客户端向服务端上传文件(TCP通信)
一、实验内容 编写一个客户端向服务端上传文件的程序,要求使用TCP通信的的知识,完成将本地机器输入的路径下的文件上传到D盘中名称为upload的文件夹中。并把客户端的IP地址加上count标识作为上传后文件的文件名,即IP(count&#…...
问题:前端获取long型数值精度丢失,后面几位都为0
文章目录 问题分析解决 问题 通过接口获取到的数据和 Postman 获取到的数据不一样,仔细看 data 的第17位之后 分析 该字段类型是long类型问题:前端接收到数据后,发现精度丢失,当返回的结果超过17位的时候,后面的全…...
Day26:安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全
目录 新闻列表 自写模版引用 Smarty模版引用 代码RCE安全测试 思维导图 PHP知识点: 功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等 技术:输…...
LVS集群(Linux Virtual server)介绍----及LVS的NAT模式部署(一)
群集的含义 ●Cluster,集群、群集由多台主机构成,但对外只表现为一个整体,只提供访问入口(域名或IP地址),相当于一台大型计算机 问题: 互联网应用中,随着站点对硬件性能、响应速度、服务稳定性、数据可靠…...
海外媒体宣发套餐如何利用3种方式洞察市场-华媒舍
在当今数字化时代,媒体宣发成为了企业推广产品和品牌的重要手段之一。其中,7FT媒体宣发套餐是一种常用而有效的宣传方式。本文将介绍这种媒体宣发套餐,以及如何利用它来洞察市场。 一、关键概念 在深入讨论7FT媒体宣发套餐之前,让…...
开发知识点-Apache Struts2框架
Apache Struts2 介绍S2-001S2CVE-2023-22530 介绍 Apache Struts2是一个基于MVC(模型-视图-控制器)设计模式的Web应用程序框架,它是Apache旗下的一个开源项目,并且是Struts1的下一代产品。Struts2是在Struts1和WebWork的技术基础…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。
2024 年,高端封装市场规模为 80 亿美元,预计到 2030 年将超过 280 亿美元,2024-2030 年复合年增长率为 23%。 细分到各个终端市场,最大的高端性能封装市场是“电信和基础设施”,2024 年该市场创造了超过 67% 的收入。…...
ZYNQ学习记录FPGA(二)Verilog语言
一、Verilog简介 1.1 HDL(Hardware Description language) 在解释HDL之前,先来了解一下数字系统设计的流程:逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端,在这个过程中就需要用到HDL,正文…...
英国云服务器上安装宝塔面板(BT Panel)
在英国云服务器上安装宝塔面板(BT Panel) 是完全可行的,尤其适合需要远程管理Linux服务器、快速部署网站、数据库、FTP、SSL证书等服务的用户。宝塔面板以其可视化操作界面和强大的功能广受国内用户欢迎,虽然官方主要面向中国大陆…...
深入理解 C++ 左值右值、std::move 与函数重载中的参数传递
在 C 编程中,左值和右值的概念以及std::move的使用,常常让开发者感到困惑。特别是在函数重载场景下,如何合理利用这些特性来优化代码性能、确保语义正确,更是一个值得深入探讨的话题。 在开始之前,先提出几个问题&…...
SQLSERVER-DB操作记录
在SQL Server中,将查询结果放入一张新表可以通过几种方法实现。 方法1:使用SELECT INTO语句 SELECT INTO 语句可以直接将查询结果作为一个新表创建出来。这个新表的结构(包括列名和数据类型)将与查询结果匹配。 SELECT * INTO 新…...
