SQL Server Express

Microsoft SQL Server Express是微软公司所开发的关系数据库产品SQL Server的免费下载版本，可自由下载、分发（需经注册）及使用。这个版本的设计是专门为嵌入式系统或较小型的程式而设计。本产品可溯源至过往随同SQL Server 2000软件分发的Microsoft Database Engine (MSDE)，用以让程式开发者在其测试其程式时建立一个系统需求较低的测试环境。自SQL Server 2005开始，本产品改用现时的名称。

它继承了多数的SQL Server功能与特性，像是Transact-SQL、SQL CLR等，相当适合使用在小型的网站，或者是小型的桌面型应用程序，它也可以和 SQL Server 整合，作为数据库复制（Replication）的订阅端。

## 功能与限制

SQL Server Express提供了付费的完整版本的多项功能，然而其技术限制使之无法适用于大规模的部署。这两个版本的差异在于：

- 数据库的大小限制：对SQL Server 2008 R2 Express、SQL Server 2012 Express、SQL Server 2014 Express、SQL Server 2016 Express、SQL Server 2019 Express单个数据库的大小限制最大为 10 GB；而在较早期的SQL Server 2005 Express 和SQL Server 2008 Express 上，单个数据库的大小限制最大为4 GB。即使如此，亦已比最初MSDE版本的2 GB要多。而且这个大小的限制只有在资料档案上，交易记录档则不受此限。
- 没有SQL Agent服务：若要做排程服务必须自己写程式。
- 允许在多核心的电脑上使用，但只会使用一个CPU核心来运算。这在具有多核心CPU的电脑上会造成浪费。MSDE 最高可以支援二颗 CPU核心。
- 可使用的内存量最高只有 1GB。而全功能标准版至少使用4GB内存。

MSDE有一个并发工作负债监控器并限制在少量用户并发访问，SQL Server Express没有这个并发限制。

SQL Server Express包括了几个数据库管理的图形用户界面工具：

- SQL Server Management Studio - 2012 SP1开始；在此之前，仅提供“SQL Server Management Studio Express”的精简版本
- SQL Server Configuration Manager
- SQL Server Surface Area Configuration tool
- SQL Server Business Intelligence Development Studio

MSDE则没有管理界面

SQL Server Express不包括全功能标准版的几个工具：

- Analysis Services
- Integration Services
- Notification Services

SQL Server Express的各版本是可以远程连接的，但需要用户做一定的配置。

## 过往版本

版本号码｜发行日期｜主流支援完结日期｜延伸支援完结日期｜支援操作系统

SQL Server 2005 Express Edition｜2005-11-07｜2011-04-12｜2016-04-12｜Windows 2000 Service Pack 4, Windows XP Service Pack 2, Windows Server 2003 Service Pack, Windows 7 Service Pack 1 (only SQL Server 2005 Express Edition SP4)

SQL Server 2008 Express｜2009-02-08｜2014-07-08｜2019-07-09｜Windows XP Service Pack 2, Windows XP Service Pack 3, Windows Vista, Windows Vista Service Pack 1, Windows Server 2003 Service Pack 2, Windows Server 2008

SQL Server 2008 R2 Express｜2010-04-16｜2014-07-08｜2019-07-09｜Windows XP, Windows Vista, Windows 7, Windows 8, Windows Server 2003, Windows Server 2008, Windows Server 2008 R2, Windows Server 2012, Windows Server 2012 R2

SQL Server 2012 Express｜2012-05-14｜2017-07-11｜2022-07-12｜Windows Vista Service Pack 2, Windows 7, Windows 7 Service Pack 1, Windows 8, Windows 8.1, Windows Server 2008, Windows Server 2008 R2, Windows Server 2008 R2 SP1, Windows Server 2012, Windows Server 2012 R2

SQL Server 2014 Express｜2014-04-01｜2019-07-09｜2024-07-09｜Windows 7 Service Pack 1, Windows 8, Windows 8.1, Windows 10, Windows Server 2008 SP2, Windows Server 2008 R2 SP1, Windows Server 2012, Windows Server 2012 R2

SQL Server 2016 Express｜2016-06-01｜2021-07-13｜2026-07-14｜Windows 8, Windows 8.1, Windows 10, Windows Server 2012, Windows Server 2012 R2, Windows Server 2016

SQL Server 2017 Express｜2017-09-29｜2022-10-11｜2027-10-12｜Windows 8, Windows 8.1, Windows 10, Windows Server 2012, Windows Server 2012 R2, Windows Server 2016、,Red Hat Enterprise Linux 7.3 or 7.4, SUSE Enterprise Linux Server v12 SP2, Ubuntu 16.04LTS, Docker Engine 1.8+ (on Windows, Mac, or Linux)

- 并不包括 Windows Server 2016 "Essentials" Edition

### 安装版本

SQL Server Express 2017 或 2019，SQL Server Express有三款安装版本：

- 标准的SQL Server Express，或称Express Core： SQL Server Engine only
- 高级版本（with Advanced Services），或称Express Advanced：还包括有Reporting services及全文检索（Full Text Service），在旧版本均包括在标准安装版本内。
- LocalDB：比标准版本更轻便的数据库。具有全部的编程特性，但在用户模式下运行。只能在本地连接数据库。从SQL Server 2012版开始有了LocalDB。在Visual Studio 2019安装中，带有SQL Server Express 2016 LocalDB

## 数据库管理工具

- Navicat for SQL Server是一套付费软件，专为Microsoft SQL Server设计的强大数据库管理及开发工具。它可以用于任何版本的SQL Server数据库（包括SQL Server Express），并支援大部分SQL Server的功能，包括触发器、索引、检视等。
- SQL Server Management Studio微软团队开发的免费GUI连线工具，强大且优秀的管理界面，容易上手。

## 到服务器的连接

SQL Server包括Express版本，有3种到数据库服务器的连接（connection）方式：

- 共享内存：仅限于本地访问

其中后两种需要在SQL Server Configuration Manager软件中，SQL Server Network Configuration下的“Protocols for SQLEXPRESS”，把Nameed Pipes与TCP/IP手工置为Enable。对于第三种，还需要在上述的配置时，在TCP/IP Properties的IP Addresses中把IPALL的“TCP Port”设为1433.

## 工具

- SQL Server Management Studio Express，可用来管理 SQL Server Express 实体。
- SQL Server Reporting Service Express，简易版的 SQL Server Reporting Service。
- SQL Server Configuration Manager，可用来管理 SQL Server Express 的连线组态与服务。
- Business Intelligence Development Studio Express，可用来开发 Reporting Service Express 的报表。
- 命令行工具sqlcmd，如下：

```
$sqlcmd -S thisisaserver.com -U username
Password:
1> SELECT name FROM SYSOBJECTS WHERE xtype = 'U'
2> GO
name

EquitySecMstr
(1 rows affected)
1>
```

## LocalDB

LocalDB的全称是Microsoft SQL Server Express LocalDB。

### 安装

从Microsoft下载的SqlLocalDB.msi约54MB。也可以使用Microsoft SQL Server Express的安装程序，在第一页选择第3项“Download Media”，随后在下一页选择第3项“localDB(54MB)”即可下载。

### 使用

命令行工具SqlLocalDB，用于创建和管理LocalDB的实例。

```powershell
C:\> SqlLocalDb info	
#输出默认实例名字：MSSQLLocalDB			

#创建一个实例（相当于一个server）：
C:\> SqlLocalDb create "MyInstance"	
#输出：LocalDB instance "MyInstance" created with version 15.0.2000.5.

C:\> sqllocaldb info "MyInstance"
#输出：
#Name:               MyInstance
#Version:            15.0.2000.5
#Shared name:
#Owner:              MyDomainName\MyUserName
#Auto-create:        No
#State:              Stopped
#Last start time:    2022/3/9 19:04:41
#Instance pipe name:

C:\> sqllocaldb start "MyInstance"
#输出： LocalDB instance "MyInstance" started.
#类似的，可以有：
#C:\> SqlLocalDb stop "MyInstance"
#C:\> SqlLocalDb delete "MyInstance"	
```

系统数据库文件存储于本地AppData路径下，通常为`C:\Users\<user>\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\`。

LocalDB 是在Windows当前用户的用户进程中运行。而SQL Server Express是作为Windows Service运行。所以，LocalDB的数据存储是Windows用户私有的。在Visual Studio启动IIS Express也是当前用户的用户进程执行，所以可以访问LocalDB。

把私有的数据存储变为共享实例。例如，原存储为“(localdb)\v11.0”：

```
sqllocaldb share v11.0 IIS_DB
```

现在为公共名字IIS_DB。该电脑所有用户均可以用“(localdb)\.\IIS_DB”访问该实例。注意，名字中的前缀“\.”表示这是共享实例名字。即其保存的文件的路径不会放在特定用户的documents目录中。连接字符串可为：

```
Data Source=(localdb)\.\IIS_DB;Initial Catalog=OldFashionedDB;Integrated Security=True
```

在Visual Studio中通过 SQL Server Object Explorer 连接上述localDB实例，在query窗口执行下述脚本可以授予账号数据实例的管理员权限：

```
create login [IIS APPPOOL\ASP.NET v4.0] from windows;
exec sp_addsrvrolemember N'IIS APPPOOL\ASP.NET v4.0', sysadmin
```

### SQLCMD使用的连接字符串

`C:\>sqlcmd -S "(localdb)\MyInstance"` 就可以在交互环境下执行查询：

```sql
SELECT @@VERSION;
GO
CREATE DATABASE blat;
GO
USE blat;
GO
CREATE TABLE dbo.splunge(Mort int);
GO
INSERT dbo.Splune(Mort) VALUES(1);
SELECT * FROM dbo.splunge;
GO		
```

### Microsoft SQL Server Management Studio连接LocalDB

Server Name使用`(localdb)\MyInstance`

## 编程接口

### ADO.Net

```C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace Connection
{
    class Program
    {
        static void Main(string[] args)
        {
            //构造连接字符串
            SqlConnectionStringBuilder connStr = new SqlConnectionStringBuilder();
            connStr.DataSource = @".\SQLEXPRESS";
            connStr.InitialCatalog = "master";
            connStr.IntegratedSecurity = true;

            SqlConnection conn = new SqlConnection();//创建连接对象
            conn.ConnectionString = connStr.ConnectionString;//设置连接字符串

            conn.Open();//打开连接

            if(conn.State == ConnectionState.Open)
            {
                Console.WriteLine("Database is linked.");
                Console.WriteLine("\nDataSource:{0}",conn.DataSource);
                Console.WriteLine("Database:{0}",conn.Database);
                Console.WriteLine("ConnectionTimeOut:{0}",conn.ConnectionTimeout);
            }

            conn.Close();//关闭连接
            conn.Dispose();//释放资源

            if(conn.State == ConnectionState.Closed)
            {
                Console.WriteLine("\nDatabase is closed.");
            }

            Console.Read();
        }
    }
}
```

对于较高版本，如SQL Server Express大于版本2010的，可以通过在Visual Studio，依次点击“视图”(菜单栏)->“服务器资源管理器（Server Explorer）”，进入“服务器资源管理器”窗口。右键点击“数据连接（Data Connection）”，在弹出的上下文菜单中选择“添加连接（Add Connection）”，在弹出的窗口中将Data Source选择为Microsoft SQL Server，“服务器名”设置为(LocalDb)\MSSQLLocalDB，附加服务器文件为具体的mdf文件并点击确定。此时，通过Microsoft SQL Server（SQL Client）方式访问指定的mdf文件。

```C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Data.SqlClient;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection();
            connection.ConnectionString =
                @"Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=D:\apps\Documents\NORTHWND.mdf;Integrated Security = True;Connect Timeout = 30;";
              //@"Data Source=(localdb)\MyInstance;InitialCatalog =blat;Integrated Security = True;Connect Timeout = 30;";
            connection.Open();
            if (connection.State == ConnectionState.Open)
            {
                Console.WriteLine("Database is linked.");
                Console.WriteLine("DataSource:{0}", connection.DataSource);
                Console.WriteLine("Database:{0}", connection.Database);
                Console.WriteLine("ConnectionTimeOut:{0}", connection.ConnectionTimeout);
            }
            SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Employees", connection);
            DataTable table = new DataTable();
            adapter.Fill(table);
            var result = (from row
                          in table.Rows.Cast<DataRow>()
                          select
                          new { ID = (int)row[0], LastName = (string)row[1], FirstName = (string)row[2] });
            result.ToList().ForEach(x => Console.WriteLine($"{x.ID},{x.LastName},{x.FirstName}"));
        }
    }
}
```

对于较低版本，如SQL Server Express 2005的mdf文件，可以直接用如下connection string打开访问（可能需要administrator权限）：

```C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Data.SqlClient;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection();
            connection.ConnectionString =
                @"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\apps\Documents\NORTHWND.mdf;Integrated Security = True;Connect Timeout = 30;";                
            connection.Open();
            if (connection.State == ConnectionState.Open)
            {
                Console.WriteLine("Database is linked.");
                Console.WriteLine("DataSource:{0}", connection.DataSource);
                Console.WriteLine("Database:{0}", connection.Database);
                Console.WriteLine("ConnectionTimeOut:{0}", connection.ConnectionTimeout);
            }
        }
    }
}
```

### Python

需要安装pymssql包

```Python
from sqlalchemy import create_engine
import pandas as pd
 
user = 'username'
pwd = 'password'
url = 'thisisaserver.com'
port = 1433
db = 'database'
engine = create_engine(f'mssql+pymssql://{user}:{pwd}@{url}:{port}/{db}')

sql_stmt = "SELECT name FROM SYSOBJECTS WHERE xtype = 'U'"
pd.read_sql_query(sql_stmt, engine)
```

## 外部链接

- Microsoft SQL Server Express downloads
- Microsoft SQL Server Express documentation
- SQL Server 2012 Comparison of features by edition
- SQL Server Express WebLog
- MSDN上的支援群组
- Hardware and Software Requirements for Installing SQL Server 2012
- Hardware and Software Requirements for Installing SQL Server 2014
- SQL Server Express LocalDB, from Microsoft Docs

## 基本资料

- 日语原文：Microsoft SQL Server Express
- 开发者：微软
- 编程语言：C语言、C++
- 操作系统：Microsoft Windows及Linux
- 平台：IA-32或IA-64、> 512 MB RAM。
- 类型：关系数据库管理系统
- 语言：英文、中文、法文、德文、意大利文、日文、韩文、巴西葡文、俄文及西班牙文
- 许可协议：专有软件