Sql-Server-2000

使用字元限制的 Web 表單使用唯一數據更新許多 (>3000) 記錄的方法

  • May 17, 2012

好的,正如您可能從標題的最後一部分中看出的那樣,這是一個不理想的情況。

我正在使用一個行業特定的 Web 界面軟體,我保證沒有人聽說過它,雖然它提供的海量數據輸入功能微不足道,但它確實允許我直接在其底層執行 SQL 查詢MS SQL 數據庫通過 8,000 個字元限制的 Web 表單。這是我對數據庫的最直接訪問。

我需要更新大約 3,700 條記錄中的特定欄位,每個記錄都有唯一的數據。根據這個答案,我一直在做以下事情:

UPDATE guest
 SET info4 = CASE guestid
   WHEN 12345 THEN 'BNID: 917546553'
   WHEN 67890 THEN 'BNID: B04695465'
   [etc, etc.]
   ELSE info4
 END

(該info4欄位目前對於所有記錄都是空的。)在達到字元限制並且必須使用下一個數據塊執行新更新之前,我可以將大約 200 個案例放入一個查詢中。

到目前為止我發現的事情:

  • 不包括最後的ELSE聲明將清空所有不滿足案例的記錄的欄位。
  • 在送出之前,我得到“受影響的行:$$ # of rows in the table $$" 而不是實際獲取新數據的行數。

我知道我應該在最後放置一個WHERE guestid IN (12345, 67890)以避免在每一行上執行更新,但是為了避免在每個更新語句塊中執行超過我的字元限制,這將是地獄般的。

碰巧的是,我目前正在從 Excel 電子表格中獲取源數據,將其全部粘貼到 Notepad++ 中,在其上執行查找/替換以插入必要的 SQL 語法,然後根據字元限制將其分塊。

所以,簡而言之,我的問題是:我是否已經盡可能地探索了這一點?有什麼大而明顯的東西我錯過了,還是我應該以完全不同的方式解決這個問題?每個案例減少字元的獎勵積分!

SET可以簡單一點:

SET info4 = 'BNID: ' +
 CASE guestid
   WHEN 12345 THEN '917546553'
   WHEN 67890 THEN 'B04695465'
     [etc, etc.]
                         --- no ELSE here
 END 

WHERE info4 IS NULL       --- and this is needed

每個案例節省 6 個字元。


如果您可以創建一個表(甚至是臨時表),您還可以使用:

--- run once
CREATE TABLE #tmp
( guestid INT NOT NULL
, i4 VARCHAR(200)
, PRIMARY KEY (guestid)
) ;

--- as many times as needed
INSERT INTO #tmp VALUES
(12345,'917546553'),
...
(67890,'B04695465');

然後:

UPDATE guest
 SET info4 = 'BNID: ' + i4
FROM guest
 JOIN #tmp
   ON #tmp.guestid = guest.guestid
WHERE guest.info4 IS NULL

引用自:https://dba.stackexchange.com/questions/18094