請問各位是否知道如何將以下動作以一次查詢就完成?[table結構]
[自動編號][欄位名稱A][欄位名稱B][欄位名稱C][欄位名稱D].....須將指定一筆資料所有欄位值以同table某一筆的值來「取代」
如:
update table set(欄位名稱A,欄位名稱B,欄位名稱C,...)=(select 欄位名稱A,欄位名稱B,欄位名稱C,...from table where 自動編號=1) where 自動編號=2若欄位名稱有上百個會寫很久,而且後續維護及移植不易...不知欄位名稱如何動態取得而不是寫死的呢?
[自動編號][欄位名稱A][欄位名稱B][欄位名稱C][欄位名稱D].....須將指定一筆資料所有欄位值以同table某一筆的值來「取代」
如:
update table set(欄位名稱A,欄位名稱B,欄位名稱C,...)=(select 欄位名稱A,欄位名稱B,欄位名稱C,...from table where 自動編號=1) where 自動編號=2若欄位名稱有上百個會寫很久,而且後續維護及移植不易...不知欄位名稱如何動態取得而不是寫死的呢?
A=B.A,B=B.B ...... 這一段敘述如何才能不用這樣寫也能做到同樣目的...?
[id] [N1] [N2] [N3] ... [N100]
1 10 20 30 ... 1000
2 11 21 31 ... 1001id1的資料要拿id2的資料來取代,變成:
[id] [N1] [N2] [N3] ... [N100]
1 11 21 31 ... 1001
2 11 21 31 ... 1001這時,一般update語法要寫非常的長,而且同樣需求無法套用至table B,因為欄位名稱不同、數量也不同...變成又要寫一段針對table B的語句!
其次,你可以先delete那笔要更新的,再insert。再退一步,你可以选择动态语句拼接
不能先delete再insert,要更新的那筆ID有其他table在關聯,不能刪除,須保留原ID...
--建个sp试试吧,不是很完善
-- exec usp_update 'TableName',1,2Create proc dbo.usp_update
@table nvarchar(100),
@id1 int,
@id2 int
AS
declare @str varchar(8000)
select @str=isnull(@str,'')+',['+rtrim(name)+']=B.['+Rtrim(name)+']'
from syscolumns
where object_id(@table)=id
and [name] <>'id'
order by colidselect @str = 'Update A set '+stuff(@str,1,1,'')+' from '+@table+' A, (select * from '+@table+' where id='+rtrim(@id1)+') B'
select @str=@str+' where A.id='+rtrim(@id2)exec(@str)GO