# MSSQL 操作

參考資料:\
(<http://bmws010.ugear.tw/News/ugC_News_Detail.asp?hidNewsID=30>)

新增資料庫\
選2048MB (2G)\
還原資料庫

## 要拿來還原的 .bak檔 要放在D槽最底下(或C槽)

記得要去選項的地方，勾選

## 覆蓋現有的資料庫

### 清空資料表

```
TRUNCATE TABLE 表格名稱;
```

### 執行預存程序

`exec 預存程序名稱 輸入參數`

### 檢驗參數

`print (@index) 某個變數，或是想要輸出的值`

### 註解

`--select * from table`

### 預存程序 參數

要先設定該變數的大小為何，不然有可能會傳不進去，就會導致該參數一直為預設值

### 已經CREATE預存程序，但是ALTER說無效物件

參考資料:(<https://social.technet.microsoft.com/Forums/zh-TW/b40b0580-8221-4f15-af78-1d356a288157/store-procedure-?forum=sqlservermanagementzhcht>)

### Vw 檢視

```
CREATE view [dbo].[ViewName] as
SELECT     A.ID, A.Password 
FROM         dbo.table1 AS A

GO
```

#### 注意:建View時，不能加order by

### MSSQL遠端問題 ERROR:40

參考資料:(<https://stackoverflow.com/questions/9945409/how-do-i-fix-the-error-named-pipes-provider-error-40-could-not-open-a-connec>)

參考資料:(<http://fecbob.pixnet.net/blog/post/39058979-%E8%A7%A3%E6%B1%BAsql-server%E7%AE%A1%E7%90%86%E5%99%A8%E7%84%A1%E6%B3%95%E9%80%A3%E6%8E%A5%E9%81%A0%E7%AB%AF%E8%B3%87%E6%96%99%E5%BA%AB%E7%9A%84%E5%95%8F>)

將資料庫的主機防火牆打開1433port

流程: 防火牆>輸入規則>新增規則 選擇要開port的，輸入1433，設定你想要的命名

就排除問題囉!

### 遇到交易紀錄已滿

ERROR MESSAGE

資料庫 'DB\_NAME' 的交易記錄已滿。如果要了解為何無法重複使用記錄中的空間，請參閱 sys.databases 中的 log\_reuse\_wait\_desc 資料行。

```
USE [DB_NAME];
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE [DB_NAME]
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE ([DB_Log_File_Name], 1);
GO
-- Reset the database recovery model.
ALTER DATABASE [DB_NAME]
SET RECOVERY FULL;
GO
```

如果遇到有做鏡像的資料庫

> 先把鏡像的停掉 將主要的LOG壓縮 將主要的資料庫備份 還原到鏡像的資料庫 啟動還原的資料庫

## \[DB\_Log\_File\_Name] 不是檔案名稱，是邏輯名稱!!

## \[DB\_Log\_File\_Name] 不是檔案名稱，是邏輯名稱!!

## \[DB\_Log\_File\_Name] 不是檔案名稱，是邏輯名稱!!

如何看邏輯名稱? 所選資料庫 右鍵\[屬性]>選取\[檔案]頁面 看要壓縮的檔案名稱的邏輯名稱為何。

### 將資料庫設定為單一使用者模式

參考資料:(<https://docs.microsoft.com/zh-tw/sql/relational-databases/databases/set-a-database-to-single-user-mode?view=sql-server-2017>)

```
USE master;
GO
ALTER DATABASE [DB_Name]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO
```

### 將資料庫設定為唯獨

```
ALTER DATABASE [DB_Name]
SET READ_ONLY;
GO
```

### 將資料庫設定為多人存取模式

```
ALTER DATABASE [DB_Name]
SET MULTI_USER;
GO
```

### 變更資料庫定序

參考資料:(<https://docs.microsoft.com/zh-tw/sql/relational-databases/collations/set-or-change-the-database-collation?view=sql-server-2017>)

```
USE master;  
GO  
ALTER DATABASE MyOptionsTest  
COLLATE French_CI_AS ;  
GO
```

## 比較差集

參考資料:(<https://dotblogs.com.tw/rainmaker/2010/12/06/19940>)

列出 table1 有的，table2 沒有的

```
select ID
from table1 
except
select ID
from table2
```

## &#x20;SQL Server獨佔連線後踢掉的方法

參考資料:(<https://catchtest.pixnet.net/blog/post/30940441-sql-server%E7%8D%A8%E4%BD%94%E9%80%A3%E7%B7%9A%E5%BE%8C%E8%B8%A2%E6%8E%89%E7%9A%84%E6%96%B9%E6%B3%95>)

在SQL Server要修改DB參數或復原時，常常會因為DB有其他連線使用而出現 「資料庫無法獨佔鎖定來執行此作業。」的錯誤訊息 為此必須使用**SET SINGLE\_USER**的指令來踢掉其他連線再處理

不過最近遇到踢掉他人後連線卡在上面，任何操作都表示連線已被人獨占而無法執行

不用擔心，SQL Server是可以把目前連線給踢掉的...只要你有sa權限

```
--踢掉其他連線的語法
USE master;
GO
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
```

```
--查詢目前連線的語法
USE master;
GO
exec sp_who
```

## 不允許儲存變更

參考資料:(<https://support.microsoft.com/zh-tw/help/956176/error-message-when-you-try-to-save-a-table-in-sql-server-saving-change>)

參考資料:(<https://byron0920.pixnet.net/blog/post/85624016>)

![](https://460672175-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lmbdh9OrhI1G9B94HRH%2F-MNoshIoPYexUBD5y5b3%2F-MNqDJSuZMUiUn2oCYMI%2Fimage.png?alt=media\&token=1f9418dc-92a5-4e20-9c0a-07c0ce4b962d)

## 登入時使用非1433 Port

```
-- http://ip:port   but  SSMS  ip,port
ip,port
pass
```
