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

SQL Server 變數指派陷阱:SELECT 回傳多列時的行為差異

     編輯:關於SqlServer

現象

將 SELECT 結果直接指派給變數時,若查詢回傳多列,變數最終會保留最後一列的值,且不會報錯。

範例 1:單列結果(正常)

DECLARE @user NVARCHAR(20) = 'user1'
DECLARE @userweek INT

SELECT @userweek = [week] FROM base WHERE userid = @user
-- 假設只有一列符合
SELECT @userweek  -- 正確回傳該列的 week 值

範例 2:多列結果(陷阱)

DECLARE @user NVARCHAR(20) = 'user1'
DECLARE @userweek INT

SELECT @userweek = [week] FROM base  -- 無 WHERE 條件,回傳所有列
-- 假設 base 有 100 列
SELECT @userweek  -- 回傳第 100 列的 week 值(最後一列)

解釋

  • SQL Server 依序處理每一列,每列都將值指派給變數,最後一列「獲勝」
  • @@ROWCOUNT 仍會正確回傳影響列數(如 100),但變數值不可預期

最佳實踐

  1. 確保指派給純量變數的查詢最多回傳一列(加 TOP 1 或唯一鍵條件)
  2. 需處理多列時,改用 SELECT ... INTO #temp、游標、或 STRING_AGG (SQL 2017+) 等集合操作
  3. 撰寫動態 SQL 時特別小心:EXEC('SELECT @var = col FROM tbl') 同樣受此規則限制
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved