首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL INSERT 語句完整指南:語法、ASP.NET 實作與最佳實務

     編輯:關於SqlServer

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');

ASP.NET (C#) 參數化實作 — 防 SQL Injection 標準範本

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}");
    }
}

進階:OUTPUT 子句 (SQL 2005+) — 取回多欄位自動產生值

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;  -- 取回完整新列資訊

多筆插入優化 (SQL 2008+)

INSERT INTO Products (ProductName, UnitPrice, CategoryID)
VALUES 
    (N'Pencil', 0.50, 1),
    (N'Eraser', 0.30, 1),
    (N'Ruler', 1.20, 1);
  • 單次陳述式插入最多 1000 筆值列表 (超過請分批或用 SqlBulkCopy/BULK INSERT/表值參數)。
  • 配合交易可確保原子性。

大量資料匯入:SqlBulkCopy (ADO.NET) / BULK INSERT (T-SQL)

-- 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() 判斷

最佳實務清單

  1. 永遠使用參數化查詢,拒絕字串拼接。
  2. 明確列出欄位清單。
  3. 需取回自動值用 SCOPE_IDENTITY() / OUTPUT,勿用 @@IDENTITY。
  4. 大量資料用 SqlBulkCopy / BULK INSERT / 表值參數。
  5. 長時間操作包裝在交易中,設定 SET XACT_ABORT ON。
  6. 錯誤處理用 TRY...CATCH,記錄詳細錯誤資訊。

INSERT 看似簡單,但關聯資料完整性、效能、安全性。遵循上述原則,即能構建穩健的資料寫入邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved