【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 - since 2012 SP1; before that, only a stripped-down version called SQL Server Management Studio Express is provided
*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的各版本是可以远程连接的，但需要用户做一定的配置。
==过往版本==
*并不包括 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
==默认实例和命名实例==
使用 Microsoft SQL Server 安装向导的"实例名"页，可指定创建默认实例还是创建 SQL Server Express 命名实例。除非您选择默认实例，否则 SQL Server Express 将始终安装命名实例 (SQLExpress)。如果选择"默认实例"，而计算机上已经存在默认实例，则 SQL Server 安装程序将升级该默认实例。请选择此选项来安装 SQL Server Express 的默认实例。一台计算机只能承载一个默认实例。
注意：默认实例名为 MSSQLSERVER；它不需要客户端指定实例名称即可建立连接。
命名实例需遵守：
* 实例名不区分大小写。
* 实例名不能包含 Default、MSSQLServer 或其他保留关键字。如果在实例名中使用了保留关键字，则将发生错误。
* 实例名限制为 16 个字符。
* 实例名的首字符必须是字母或下划线 (_)。可接受的字母为 Unicode 标准 2.0 中定义的字符，包括拉丁字符 a-z 和 A-Z，以及源于其他语言的字母字符。
* 后续字符可以是 Unicode 标准 2.0 定义的字母、源于基本拉丁语或其他国家/地区书写符号的十进制数字、美元符号 ($) 或者下划线 (_)。
* 实例名中不允许有其他特殊字符的嵌入空格；也不允许有反斜杠 (/)、逗号 (,)、冒号 (:)、分号 (;)、单引号 (')、"and"符 (&)、数字符号 (#) 或"at"符号 (@)。
* 只有在当前 Microsoft Windows 代码页中有效的字符才能在 SQL Server 实例名中使用。如果使用了不支持的 Unicode 字符，将会发生错误。
== 资料库管理工具 ==
*  Navicat for SQL Serverdate=20151006114748  是一套付费软体，专为 Microsoft SQL Server 设计的强大资料库管理及开发工具。它可以用于任何版本的  SQL Server 资料库（包括SQL Server Express），并支援大部份  SQL Server 的功能，包括触发器、索引、检视等。
==到服务器的连接==
SQL Server包括Express版本，有3种到数据库服务器的连接（connection）方式：
* 共享内存：仅限于本地访问
* 命名管道：
* TCP/IP通信：
其中后两种需要在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.
注意，数据库管理员账号sa默认是登录锁定的。需要在Microsoft SQL Server Management Studio的Security->Logins->sa->Status页面：
* Permission to connect to database engine选择Grant
* Login选择Enabled
* Login is locked out不选中
== 工具 ==
* 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)”即可下载。Visual Studio 2019  installer内置了SQL Server 2016 Express LocalDB的安装选项。
===使用===
命令行工具SqlLocalDB，用于创建和管理LocalDB的实例。
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\\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"
就可以在交互环境下执行查询：
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===
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文件。
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()
select
new { ID = (int)row0, LastName = (string)row1, FirstName = (string)row2 });
result.ToList().ForEach(x => Console.WriteLine($"{x.ID},{x.LastName},{x.FirstName}"));
}
}
}
对于较低版本，如SQL Server Express 2005的mdf文件，可以直接用如下connection string打开访问（可能需要administrator权限）：
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包
import pymssql
user = 'sa'
pwd = '123456'
server = '10.219.55.186'
port = 1433
db = 'myDatabase'
sql_stmt = "SELECT name FROM SYSOBJECTS WHERE xtype = 'U'"
conn = pymssql.connect(server, user, pwd, db)
cursor = conn.cursor(as_dict=False)
cursor.execute(sql_stmt)
row = cursor.fetchone()
while row:
print("%s" % (row0))
row = cursor.fetchone()
conn.close()
使用sqlalchemy的ORM：
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)