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的各版本是可以遠程連接的，但需要用戶做一定的配置。

**過往版本**
並不包括 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）方式：- 共享內存：僅限於本地訪問- 命名管道：- 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.

**工具**
 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的實例。
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包
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)

**參考資料**

**參看**
 SQL Server Compact- MSDE- SQLite- Microsoft SQL Server- Microsoft Servers- SQL Server Management Studio（SSMS）- 關係型資料庫管理系統比較

**外部連結**
  Microsoft SQL Server Express downloadsdate=20170212234445 -  Microsoft SQL Server Express documentationdate=20151220101128 -  SQL Server 2012 Comparison of features by editiondate=20170925071613 -  SQL Server Express WebLogdate=20100523070355 -  MSDN上的支援群組-  Hardware and Software Requirements for Installing SQL Server 2012date=20171111041430 -  Hardware and Software Requirements for Installing SQL Server 2014date=20170527144131 -  SQL Server Express LocalDB, from Microsoft Docs date=20220310005415