![](/img/trans.png)
[英]What is the easiest way using T-SQL / MS-SQL to append a string to existing table cells?
[英]What is the T-SQL to normalize an existing table?
我想將現有表格轉換為第一范式(最簡單的規范化可能;參見示例)。
你碰巧知道T-SQL是針對這類問題的嗎? 非常感謝!
更新
嘗試下面的答案,它完美地工作。 以下是我用來測試答案的步驟:
在上面的案例中@Thomas有一個完美可行的解決方案。 但是,有時人們為了提出問題而簡化,所以如果你需要去多個表(或者第一個表對名稱沒有唯一約束),我會解決你可能想做的事情,而不僅僅是二。
首先,我將數據插入到臨時表中,並為id添加一個列為null的列。 然后我將使用OUTPUT子句向父表寫入一個插入,以將id和自然鍵輸出到表變量。 然后我將使用表變量來更新登台表中的id字段。 然后我會將登台表中的記錄插入到其他表中。 由於我現在擁有id,因此不再需要訪問原始父表。 (如果記錄數量很大,我也可以索引登台表)。
現在,如果你沒有自然鍵,那么這個過程會變得更難,因為你無法識別哪個記錄歸誰所有。 然后我通常會在登台表中添加一個標識,然后一次向父表導入一個記錄(包括stagingtableid作為游標中的變量),然后用每個父表id更新登台表,因為它是創建。 更新所有初始記錄后,我使用基於集合的進程插入或更新到其他表。
登台表還使您有機會在嘗試將其放入生產表之前在本地修復任何錯誤數據。
如果事情很復雜或者這是一個重復的過程,您可能需要知道的其他語法是MERGE語句。 如果是新記錄,則插入,如果是現有記錄則更新。
如果這是一個非常復雜的轉換,您可以考慮使用SSIS。
最簡單的解決方案是只編寫一個查詢來執行導入:
-- assuming that Id is an Identity column or has some default to generate keys.
Insert Customer( [Name] )
Select Name
From Flat_csv_file
Group By Name
Insert Order( [Customer], [Description], Cost )
Select C.Id, F.Description F.Cost
From Customer As C
Join Flat_csv_file As F
On F.Name = C.Name
從Customer表開始
INSERT INTO Customer (Name)
SELECT DISTINCT Name
FROM Flat_CSV_File
如果你有重復進口
INSERT INTO Customer (Name)
SELECT DISTINCT f.Name
FROM Flat_CSV_File f
LEFT OUTER JOIN Customer c ON f.Name = c.Name
WHERE c.Id IS NULL
訂單(您的表名稱順序是TSQL中的保留字,因此您需要使用方括號引用它)
INSERT INTO [Order] (CustomerId, Description, Cost)
SELECT c.Id, f.Description, f.Cost
FROM Flat_CSV_File f
INNER JOIN Customer c ON f.Name = c.Name
如果這是一次性過程,我會首先操作.csv,並在那里形成包括主鍵的表。 填充SQL數據庫時,請使用
SET IDENTITY_INSERT Customers ON
INSERT Customers
(
...
)
SELECT
...
FROM
openrowset(...)
SET IDENTITY_INSERT Customers ON
SET IDENTITY_INSERT Orders ON
INSERT Orders
(
...
)
SELECT
...
FROM
openrowset(...)
SET IDENTITY_INSERT Orders ON
如果你需要一個純粹的TSQL解決方案,我會創建臨時表來執行相同的基本操作,並從臨時表而不是.csv中插入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.