INSERT 是向資料表新增資料的核心指令。本文涵蓋標準語法、資料型別對應、ASP.NET (C#) 參數化實作、OUTPUT 子句取回自動產生值、多筆插入與效能技巧。
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
N'...';數值直接書寫;NULL 不加引號。INSERT INTO Authors (au_fname, au_lname) VALUES (N'Bertrand', N'Russell');
using System;
using System.Data;
using System.Data.SqlClient;
public void InsertProduct(string productName, decimal price, int categoryId)
{
const string connStr = "Server=.;Database=Northwind;Integrated Security=true;";
const string sql = @"
INSERT INTO Products (ProductName, UnitPrice, CategoryID)
VALUES (@ProductName, @UnitPrice, @CategoryID);
SELECT SCOPE_IDENTITY();"; -- 取回新 IDENTITY
using (var conn = new SqlConnection(connStr))
using (var cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.Add("@ProductName", SqlDbType.NVarChar, 100).Value = productName;
cmd.Parameters.Add("@UnitPrice", SqlDbType.Money).Value = price;
cmd.Parameters.Add("@CategoryID", SqlDbType.Int).Value = categoryId;
conn.Open();
var newId = Convert.ToInt32(cmd.ExecuteScalar()); -- 取回單一值
Console.WriteLine($"新產品 ID: {newId}");
}
}
DECLARE @NewRows TABLE (ProductID INT, CreatedAt DATETIME);
INSERT INTO Products (ProductName, UnitPrice, CategoryID, CreatedAt)
OUTPUT INSERTED.ProductID, INSERTED.CreatedAt INTO @NewRows
VALUES (N'Chalk', 1.50, 1, SYSDATETIME());
SELECT * FROM @NewRows; -- 取回完整新列資訊
INSERT INTO Products (ProductName, UnitPrice, CategoryID)
VALUES
(N'Pencil', 0.50, 1),
(N'Eraser', 0.30, 1),
(N'Ruler', 1.20, 1);
SqlBulkCopy/BULK INSERT/表值參數)。-- T-SQL BULK INSERT (需檔案在伺服器可存取路徑)
BULK INSERT Products FROM 'C:\Data\Products.csv'
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', FIRSTROW = 2, CODEPAGE = '65001');
// C# SqlBulkCopy (客戶端資料流,不需伺服器端檔案)
using (var bulk = new SqlBulkCopy(connStr))
{
bulk.DestinationTableName = "Products";
bulk.ColumnMappings.Add("ProductName", "ProductName");
bulk.ColumnMappings.Add("UnitPrice", "UnitPrice");
bulk.ColumnMappings.Add("CategoryID", "CategoryID");
bulk.WriteToServer(dataTable); // DataTable 或 IDataReader
}
| 錯誤 | 原因 | 解決 |
|---|---|---|
| 字串截斷 | 輸入長度超過欄位定義 | 驗證長度、調整欄位長度、用 MAX 型別 | 型別轉換失敗 | 字串存入數值/日期欄位 | 參數化查詢自動處理型別、前端驗證 |
| 主鍵/唯一鍵衝突 | 重複鍵值 | MERGE / INSERT ... WHERE NOT EXISTS / TRY...CATCH 處理 2627 錯誤 |
| IDENTITY 插入失敗 | 嘗試指定 IDENTITY 值 | SET IDENTITY_INSERT table ON (需權限),插完關閉 |
| 觸發器回滾 | INSTEAD OF/AFTER 觸發器 ROLLBACK | 檢查觸發器邏輯、XACT_STATE() 判斷 |
SCOPE_IDENTITY() / OUTPUT,勿用 @@IDENTITY。SqlBulkCopy / BULK INSERT / 表值參數。SET XACT_ABORT ON。TRY...CATCH,記錄詳細錯誤資訊。INSERT 看似簡單,但關聯資料完整性、效能、安全性。遵循上述原則,即能構建穩健的資料寫入邏輯。