台灣最大程式設計社群網站
線上人數
772
 
會員總數:246143
討論主題:189729
歡迎您免費加入會員
討論區列表 >> MS SQL >> [SQL]如何替換現有資料庫內的部份內容
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
[SQL]如何替換現有資料庫內的部份內容
價值 : 0 QP  點閱數:10624 回應數:4
樓主

百鳥朝鳳
初學者
64 19
82 25
發送站內信

小弟用 SQL 7.0。現在有個問題是,某資料庫內有許多網址資料,現在該網址由 http://aaa.aaa.aaa 更換為 http://bbb.bbb.bbb

所以需要把資料庫中所有原來這樣的連結字串 http://aaa.aaa.aaa/123.htm 改成這樣的 http://bbb.bbb.bbb/123.htm,依此類推,修改部份的字串。

以前做成 HTML 時,我是用一些文書軟體或者專門的搜尋替換軟體,來把這個字串搜尋出來並替換之。

那麼在SQL7.0 的資料庫裡面,要怎麼做呢?(架設 SQL 的機器在手邊可以操作)

謝謝!

本篇文章發表於2002-07-04 14:29
1樓

 Transact-SQL 程式語法的參考說明 

 
UPDATE
變更資料庫中現有的資料。

語法
UPDATE
        { 
         table_name WITH ( < table_hint_limited > [ ...n ] )
         | view_name
         | rowset_function_limited
        } 
        SET
        { column_name = { expression | DEFAULT | NULL }
        | @variable = expression
        | @variable = column = expression } [ ,...n ]

    { { [ FROM { < table_source > } [ ,...n ] ]

        [ WHERE
            < search_condition > ] }
        | 
        [ WHERE CURRENT OF
        { { [ GLOBAL ] cursor_name } | cursor_variable_name }
        ] } 
        [ OPTION ( < query_hint > [ ,...n ] ) ]

< table_source > ::=
    table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ]
    | view_name [ [ AS ] table_alias ]
    | rowset_function [ [ AS ] table_alias ]
    | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
    | < joined_table >

< joined_table > ::=
    < table_source > < join_type > < table_source > ON < search_condition >
    | < table_source > CROSS JOIN < table_source >
    | < joined_table >

< join_type > ::=
    [ INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } ]
    [ < join_hint > ]
    JOIN

< table_hint_limited > ::=
    {    FASTFIRSTROW
        | HOLDLOCK
        | PAGLOCK
        | READCOMMITTED
        | REPEATABLEREAD
        | ROWLOCK
        | SERIALIZABLE
        | TABLOCK
        | TABLOCKX
        | UPDLOCK 
    } 

< table_hint > ::=
    {    INDEX ( index_val [ ,...n ] )
        | FASTFIRSTROW
        | HOLDLOCK
        | NOLOCK
        | PAGLOCK
        | READCOMMITTED
        | READPAST
        | READUNCOMMITTED
        | REPEATABLEREAD
        | ROWLOCK
        | SERIALIZABLE
        | TABLOCK
        | TABLOCKX
        | UPDLOCK 
    } 

< query_hint > ::=
    {    { HASH | ORDER } GROUP
        | { CONCAT | HASH | MERGE } UNION
        | {LOOP | MERGE | HASH } JOIN
        | FAST number_rows
        | FORCE ORDER
        | MAXDOP
        | ROBUST PLAN
        | KEEP PLAN 
    } 

引數
table_name

要更新之資料表的名稱。如果資料表不在目前的伺服器或資料庫中,或者擁有者不是目前的使用者,則這個名稱可以是連結伺服器、資料庫、以及擁有者名稱。

WITH (<table_hint_limited> [...n])

指定目標資料表的一或多個資料表提示。關鍵字 WITH 及雙括弧是必要的。不允許 READPAST、NOLOCK、及 READUNCOMMITTED。如需關於資料表提示的詳細資訊,請參閱 FROM。

view_name

要更新之檢視的名稱。view_name 所參考的檢視必須是可更新的。UPDATE 陳述式所作的修改無法對檢視的 FROM 子句中所參照的多個基本資料表產生影響。如需關於可更新檢視的詳細資訊,請參閱CREATE VIEW。

rowset_function_limited

為 OPENQUERY 或 OPENROWSET 函數,受限於提供者的能力。如需關於提供者所需能力的詳細資訊,請參閱 OLE DB Provider 的 UPDATE 與 DELETE 需求。如需關於資料列集函數的詳細資訊,請參閱 OPENQUERY 及 OPENROWSET。

SET

指定要更新之資料行或變數名稱的清單。

column_name

包含要變更之資料的資料行。column_name 必須位在 UPDATE 子句所指定的資料表或檢視中。無法更新識別資料行。

如果指定限定資料行名稱,該限定詞必須與 UPDATE 子句中的資料表或檢視名稱相符。例如,以下是正確的範例:

UPDATE authors
    SET authors.au_fname = 'Annie'
    WHERE au_fname = 'Anne'

在 FROM 子句中所指定的資料表別名無法用來作為 SET column_name 中的限定詞。例如,以下是不正確的範例:

UPDATE titles
    SET t.ytd_sales = t.ytd_sales + s.qty
    FROM titles t, sales s
    WHERE t.title_id = s.title_id
    AND s.ord_date = (SELECT MAX(sales.ord_date) FROM sales)

若要使本範例可以執行,請從資料行名稱中移除 t. 別名。

UPDATE titles
    SET ytd_sales = t.ytd_sales + s.qty
    FROM titles t, sales s
    WHERE t.title_id = s.title_id
    AND s.ord_date = (SELECT MAX(sales.ord_date) FROM sales)

expression

變數、常值、運算式或傳回單一值且用雙括弧括起來的 subSELECT 陳述式。運算式傳回的值會取代 column_name 或 @variable 中現有的值。

DEFAULT

指定以針對資料行所定義的預設值取代資料行中現有的值。如果資料行沒有預設值並且定義為允許空值,則可以使用這個引數將資料行變更為 NULL。

@variable

接受 expression 傳回值的已宣告變數。

SET @variable = column = expression 會將變數與資料行設定為相同的值。這與 SET @variable = column, column = expression 不同,其將變數設定為先前更新的資料行值。

FROM < table_source >

指定用來提供更新作業條件的資料表。如需詳細資訊,請參閱 FROM。 

table_name [ [ AS ] table_alias ] 
提供更新作業條件的資料表名稱。 
如果要更新的資料表與 FROM 子句中的資料表相同,並且 FROM 子句中只有一個該資料表的參照,則可以指定或不指定 table_alias。如果要更新的資料表在 FROM 子句中出現一次以上,該資料表的一個 (並且是唯一的) 參照不可指定資料表別名。在 FROM 子句中該資料表的其它所有參照必須包含資料表別名。 


view_name [ [ AS ] table_alias ] 
提供更新作業條件的檢視名稱。帶有 INSTEAD OF UPDATE 觸發程序的檢視無法作為含 FROM 子句的 UPDATE 目標。

WITH ( < table_hint > [ ...n ] ) 
指定來源資料表的一或多個資料表提示。如需關於資料表提示的詳細資訊,請參閱本書中的 FROM 。

rowset_function [ [ AS ] table_alias ] 
任意資料列集函數的名稱及選擇性別名。如需關於資料列集函數清單的詳細資訊,請參閱資料列集函數。

derived_table 
從資料庫擷取資料列的子查詢。derived_table 用來作為外部查詢的輸入。

column_alias 
在結果集中取代資料行名稱的選擇性別名。包括選取清單中各資料行的資料行別名,並且以雙括弧將整個資料行別名清單括起來。 
| < joined_table >

兩個或兩個以上資料表乘積的結果集,例如:

SELECT *
FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 = tab2.c3
    RIGHT OUTER JOIN tab3 LEFT OUTER JOIN tab4
        ON tab3.c1 = tab4.c1
        ON tab2.c3 = tab4.c3

針對多重 CROSS 聯結,請使用括弧來變更聯結的自然順序。

< join_type >

指定聯結作業的型別。 

INNER 
指定傳回所有的資料列配對。捨棄兩個資料表中不相符的資料行。如果未指定聯結型別,此為預設值。

LEFT [OUTER] 
指定除了內部聯結傳回的所有資料列之外,同時將左側資料表中所有不符合指定條件的資料列都加入結果集中。將左側資料表的輸出資料行設定為 NULL。

RIGHT [OUTER] 
指定除了內部聯結傳回的所有資料列之外,同時將右側資料表中所有不符合指定條件的資料列都加入結果集中。將右側資料表的輸出資料行設定為 NULL。

FULL 
[OUTER] 
如果左側或右側資料表的資料列不符合選取條件,則可以指定該資料列加入結果集,並且將對應於另一個資料表的輸出資料行設定為 NULL。這表示要再加上內部聯結傳回的所有資料列。

< join_hint > 
指定聯結提示或執行演算法。如果指定 <join_hint>,就必須明確地指定 INNER、LEFT、RIGHT、或 FULL。如需關於聯結提示的詳細資訊,請參閱 FROM。

JOIN 
指出應聯結之指定資料表或檢視。 
ON < search_condition >

指定聯結所根據的條件。條件可以指定任意的述詞,雖然通常使用資料行及邏輯比對運算子。例如:

FROM Suppliers JOIN Products 
    ON (Suppliers.SupplierID = Products.SupplierID)

當條件指定資料行時,資料行不須具備相同的名稱或相同的資料型別;但是,如果資料型別不相同,則必須是相容或是 Microsoft® SQL Server™ 可以隱含轉換的型別。如果資料型別無法隱含轉換,條件必須使用 CAST 函數外顯轉換資料型別。

若需搜尋條件與述詞(Predicate)的相關資訊,請參閱搜尋條件。

CROSS JOIN

指定兩個資料表的交叉乘積。傳回相同的資料列,就像要聯結的資料表僅列於FROM 子句中且未指定任何 WHERE 子句一樣。

WHERE

指定更新資料列的限制條件。根據使用 WHERE 子句格式的不同,會有兩種更新格式: 

搜尋式的更新會指定搜尋條件,以檢查要刪除的資料列。


定位更新使用 CURRENT OF 子句來指定資料指標。更新作業將發生在資料指標目前所在的位置。 
<search_condition>

指定要更新的資料列應符合的條件。搜尋條件也可以是聯結所根據的條件。搜尋條件中可以加入的述詞數目並沒有限制。如需關於搜尋條件與述詞的詳細資訊,請參閱搜尋條件。

CURRENT OF

指定在指定資料指標目前所在的位置執行更新。

GLOBAL

指定 cursor_name 參照到全域資料指標(Cursor)。

cursor_name

應提取 (fetch) 的開放式資料指標之名稱。如果全域資料指標及區域資料指標的名稱皆為 cursor_name,如指定 GLOBAL,cursor_name 表示全域資料指標。如果不指定 GLOBAL,cursor_name 則表示區域資料指標。資料指標必須允許更新。

cursor_variable_name

資料指標變數的名稱。cursor_variable_name 必須參照允許更新的資料指標。

OPTION (<query_hint> [,...n] )

指定用來自訂 SQL Server 陳述式處理程序的最佳化提示。 

{ HASH | ORDER } GROUP 
指定在查詢的 GROUP BY 或 COMPUTE 子句中所指定的彙總應該使用雜湊或排序。

{ LOOP | MERGE | HASH |} JOIN 
指定在整個查詢中,以迴圈聯結、合併聯結、或雜湊聯結來執行所有的聯結作業。如果指定多個聯結提示,查詢最佳化器會在允許的提示中選擇一個成本最低的聯結策略。在同一個查詢中,如果也指定了特定一組資料表的聯結提示,則在聯結這兩個資料表時會優先採用該提示。

{ MERGE | HASH | CONCAT } UNION 
指定以合併、雜湊、或串連 UNION 集來執行所有 UNION 作業。如果指定一個以上的 UNION 提示,查詢最佳化器會從這些指定的提示中選取一個成本最低的策略。 


附註  如果在 FROM 子句中也指定了特定聯結資料表對的聯結提示,它將優先於 OPTION 子句中所指定的任何聯結提示。




FAST number_rows 
指定針對第一 number_rows (非負整數) 的快速擷取進行查詢的最佳化。在傳回第一 number_rows 之後,繼續執行查詢並產生完整的結果集。

FORCE ORDER 
指定在查詢最佳化期間應保持查詢語法所指示的聯結順序。

MAXDOP number 
只針對指定這個選項的查詢,覆寫 [最大平行度] 組態選項 (在 sp_configure 中)。在使用 MAXDOP 查詢提示時,所有使用 [最大平行度] 組態選項的語意規則皆適用。如需詳細資訊,請參閱 max degree of parallelism 選項。

ROBUST PLAN 
強迫查詢最佳化器嘗試犧牲效能而儘可能使用最大的資料列大小。如果這種計劃不可行,查詢最佳化器將傳回錯誤,而不會延緩對查詢執行的錯誤偵測。資料列可能包含不同長度的資料行;SQL Server 允許資料列的最大可能大小定義成超過 SQL Server 的處理能力。雖然有最大可能大小,通常應用程式所儲存的資料列,其實際大小會在 SQL Server 可以處理的限制範圍內。如果 SQL Server 遇到過長的資料列,將傳回執行錯誤。 
KEEP PLAN

強迫查詢最佳化器放寬查詢的預估重新編譯臨界值。當對資料表所進行的索引資料行變更 (更新、刪除、或插入) 的預估數目已經到達預估重新編譯臨界值時,便會自動重新編譯查詢。指定 KEEP PLAN,以確保不會每當對資料表進行多重更新時,就重新編譯查詢。

備註
只有當變動的資料表是 table 變數時,在使用者自訂函數的主體中才允許 UPDATE 陳述式。

在其範圍內,存取 table 變數的方式與一般資料表相同。因此,table 變數可以作為 UPDATE 陳述句中要更新資料的資料表。

凡是資料表名稱可在 UPDATE 陳述式中出現的地方,用 OPENDATASOURCE 函數所建立的四部份式名稱就和伺服器名稱部份一樣,可以用來作為資料表來源。

如果更新資料列違反條件約束或規則,或違反資料行的 NULL 設定,或者新的值是不相容的資料型別,則會取消陳述式,傳回錯誤,並且不會更新任何記錄。

在計算運算式時,如果 UPDATE 陳述式發生算術錯誤 (溢位、除數為 0、或範圍錯誤) 時,將不會執行更新。停止執行剩餘的批次作業,並傳回錯誤訊息。

如果對資料行或參與叢集索引的資料行進行更新,而導致叢集索引及資料列的大小超過 8,060 位元組,更新將會失敗並傳回錯誤訊息。

如果在資料表的 UPDATE 動作上定義 INSTEAD-OF 觸發程序,該觸發程序會執行 UPDATE 陳述式的 instead of。SQL Server 先前的版本僅支援在 UPDATE 及其它資料變動陳述式上定義 AFTER 觸發程序。

同時更新叢集索引鍵及一或多個 text、image、或 Unicode 資料行時,如果更新查詢可能變更多個資料列,則更新作業將會失敗,並且 SQL Server 會傳回錯誤訊息。

使用 UPDATE 修改 text、ntext、或 image 資料行可初始化資料行、為該資料行指定有效的文字指標、並且配置至少一個資料頁 (除非以 NULL 更新資料行時)。



附註  UPDATE 陳述式為記錄作業。如果您要取代或修改大區塊的 text、ntext、或 image 資料,請使用 WRITETEXT 或 UPDATETEXT 陳述式,而不要使用 UPDATE 陳述式。WRITETEXT 及 UPDATETEXT 陳述式 (預設) 為非記錄作業。


所有 char 及 nchar 資料行會在右邊補上空白字元,直到所定義的長度為止。

在遠端資料表及本機與遠端分割的檢視表中,UPDATE 陳述式會忽略 SET ROWCOUNT 選項的設定。

如果 ANSI_PADDING 設定為 OFF,將會移除已插入 varchar 及 nvarchar 資料行之資料的所有尾端空白字元,只包含空白字元的字串除外。這些字串會被刪減為空字串。如果 ANSI_PADDING 設定為 ON,將會插入尾端空白字元。Microsoft SQL Server ODBC 驅動程式及 OLE DB Provider for SQL Server 自動設定每一個連線的 ANSI_PADDING 為 ON。可以在 ODBC 資料來源或連線的屬性中設定這個選項。

使用 WHERE CURRENT OF 子句的定位更新可更新資料指標目前所在位置的單一資料列。相較於使用 WHERE <search_condition> 子句來限制更新資料列的搜尋式更新,這種方式可以更為精確。當搜尋條件無法唯一識別單一資料列時,搜尋式更新將會修改多重資料列。

如果陳述式包含 FROM 子句,並且指定該子句方式未能使每一個資料行的更新可以取得唯一的值 (換句話說,如果 UPDATE 陳述式沒有決定性),則無法定義 UPDATE 陳述式的結果。例如,下列指令碼所給定的 UPDATE 陳述式,資料表  s 的兩個列都符合 UPDATE 陳述式 FROM 子句的限制,但是未定義使用  s 中的哪一個資料列來更新資料表 t 的資料列。

CREATE TABLE s (ColA INT, ColB DECIMAL(10,3))
GO
CREATE TABLE t (ColA INT PRIMARY KEY, ColB DECIMAL(10,3))
GO
INSERT INTO s VALUES(1, 10.0)
INSERT INTO s VALUES(1, 20.0)
INSERT INTO t VALUES(1, 0.0)
GO
UPDATE t 
SET t.ColB = t.ColB + s.ColB
FROM t INNER JOIN s ON (t.ColA = s.ColA)
GO

在結合 FROM 及 WHERE CURRENT OF 子句時,可能也會發生相同的問題。在本範例中,資料表 t2 中的兩個資料列都符合 UPDATE 陳述式中 FROM 子句的限制。未定義使用 t2 的哪一個資料列來更新資料表 t1 的資料列。

CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT)
GO
CREATE TABLE t2(d1 INT PRIMARY KEY, d2 INT)
GO
INSERT INTO t1 VALUES (1, 10)
INSERT INTO t2 VALUES (1, 20)
INSERT INTO t2 VALUES (2, 30)
go

DECLARE abc CURSOR LOCAL FOR
SELECT * FROM t1

OPEN abc

FETCH abc

UPDATE t1 SET c2 = c2 + d2 
FROM t2 
WHERE CURRENT OF abc
GO

設定變數及資料行
可以在 UPDATE 陳述式中使用變數名稱,顯示受影響的舊值及新值。只能在 UPDATE 陳述式影響單一資料記錄時,才能使用;如果 UPDATE 陳述式影響多重資料記錄,變數只能包含已更新資料列其中之一的值。

權限
UPDATE 使用權限預設為 sysadmin 固定伺服器角色、db_owner 與 db_datawriter 固定資料庫角色的成員、以及資料表擁有者。sysadmin、db_owner、與 db_securityadmin 角色的成員,以及資料表擁有者可以轉移權限給其它使用者。

如果 UPDATE 陳述式包含 WHERE 子句,或者如果 SET 子句中的 expression 使用資料表中的資料行,則要更新之資料表也需要 SELECT 權限。

範例
A. 使用簡單的 UPDATE
這些範例將展示在省略 UPDATE 陳述式的 WHERE 子句時,如何影響所有的資料列。

如果  publishers 資料表中的所有出版社將總公司遷移至 Georgia 州的 Atlanta,本範例將展示更新 publishers 資料表的方式。

UPDATE publishers
SET city = 'Atlanta', state = 'GA'

本範例將變更所有出版商的名稱為 NULL。

UPDATE publishers
SET pub_name = NULL

您也可以在更新中使用已計算的值。本範例將 titles 資料表中的價格變成兩倍。

UPDATE titles
SET price = price * 2

B. 使用含有 WHERE 子句的 UPDATE 陳述式
WHERE 子句指定要更新的資料列。例如,在假想的事件中,northern California 更名為 Pacifica (縮寫為 PC),而 Oakland 的居民投票將城市名稱變更為 Bay City。本範例展示如何針對住址失效的所有前 Oakland 居民,更新 authors 資料表。

UPDATE authors
   SET state = 'PC', city = 'Bay City'
      WHERE state = 'CA' AND city = 'Oakland'

您必須撰寫另外一個陳述式為 northern California 其它城市的居民變更州名。

C. 使用 UPDATE 陳述式並配合使用其它資料表的資訊
本範例將修改 titles 資料表中的 ytd_sales 資料行,以反映 sales 資料表中所記錄的最新銷售額。

UPDATE titles
   SET ytd_sales = titles.ytd_sales + sales.qty
      FROM titles, sales
         WHERE titles.title_id = sales.title_id
         AND sales.ord_date = (SELECT MAX(sales.ord_date) FROM sales)

本範例假設針對指定日期且已更新為最新資料的指定 title,只記錄一個銷售額集合。如果不是這種情況 (如果在同一天內,可以記錄指定 title 的多個銷售額),則此處所展示的範例將無法得到正確的結果。執行不會發生錯誤,但是無論該日實際上發生多少銷售額,每一個 title 只會更新一個銷售額。這是因為單一 UPDATE 陳述式不會對同一個資料列進行兩次更新。

如果在同一天內,一指定的 title 可以發生多個銷售額,則必須在 UPDATE 陳述式內彙總每一個 title 的所有銷售額,如同下列範例所顯示:

UPDATE titles
   SET ytd_sales = 
      (SELECT SUM(qty)
         FROM sales
            WHERE sales.title_id = titles.title_id
            AND sales.ord_date IN (SELECT MAX(ord_date) FROM sales))
   FROM titles, sales

D. 使用 UPDATE 配合 SELECT 陳述式中的 TOP 子句
本範例將會更新 authors 資料表前 10 個作者的 state 資料行。

UPDATE authors
SET state = 'ZZ' 
FROM (SELECT TOP 10 * FROM authors ORDER BY au_lname) AS t1
WHERE authors.au_id = t1.au_id


另請參閱 

CREATE INDEX

CREATE TABLE

CREATE TRIGGER

資料指標 

DELETE 

INSERT

SET ROWCOUNT 

文字與影像函數

©1988-2000 Microsoft Corporation. All Rights Reserved.
本篇文章回覆於2002-07-04 16:39
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

百鳥朝鳳
檢舉此回應
謝謝站長的幫忙解答!
本篇文章回覆於2002-07-04 17:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

百鳥朝鳳
檢舉此回應
不好意思,小弟對SQL並不是很懂,剛剛看了一下,似乎這只是針對整個欄位的內容作替換。

上面站長貼的部份,我看到比較接近的是
UPDATE authors
   SET state = 'PC', city = 'Bay City'
      WHERE state = 'CA' AND city = 'Oakland'


而我所要替換的,只是某欄位之中,某個字串的一部份內容。

不知道這樣要怎麼寫才可以呢?
本篇文章回覆於2002-07-04 17:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

百鳥朝鳳
檢舉此回應
小弟最後總算找到答案了,在這裡:

http://www.sqlteam.com/item.asp?ItemID=7386
本篇文章回覆於2002-07-05 01:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.