2014-10-11 28 views
0

我是SQL新手,這也許就是爲什麼我無法找到解決以下問題的原因。如何更新VARCHAR列,使其包含另外兩個由空格分隔的VARCHAR列的內容?

我有這個數據庫表中,所有列VARCHAR(50)類型:

f

而且我想在FullName更新價值觀,使他們的FirstNameLastName組合,由空格分隔。

這是我想與落得什麼:

f

我不想手動更新每一行。

+1

你要提供代碼樣本? – dotnetom 2014-10-11 08:37:39

+0

我幾乎嘗試了一切,從這篇文章中,http://stackoverflow.com/questions/22739841/sql-combine-two-columns-into-one-column – emo 2014-10-11 08:39:20

+0

我不能刪除任何列,我必須有一個列兩個值合併在一起。 – emo 2014-10-11 08:41:16

回答

1

我不想手動更新每一行。

我會告訴你兩個解決方案:

  1. UPDATE用一個語句列。這不是真的有這樣的麻煩:

    UPDATE Names 
    SET FullName = FirstName + ' ' + LastName; 
    -- or:  … = CONCAT(FirstName, ' ', LastName); 
    

    你說你所有的列被定義爲VARCHAR(50),因此要注意FirstName + ' ' + LastName可以達到50 + 1 + 50 = 101個字符的最大長度。因此,FullName可能被截斷:該列將只存儲前50個字符(或更少);如果有更多,他們會被扔掉。因此,您可能需要將FullName重新定義爲VARCHAR(101)

  2. 或者,FullName到計算列:

    ALTER TABLE Names 
    DROP COLUMN FullName; 
    
    ALTER TABLE Names 
    ADD FullName AS (FirstName + ' ' + LastName); 
    

    此解決方案有三個顯着的優點:

    1. FullName不能頂撞FirstNameLastName,因爲它被自動導出(在查詢時)通過指定的表達式從它們中刪除。
    2. 與上述解決方案一樣,沒有字符串截斷的危險。請注意,您不需要指定FullName的類型; SQL Server根據表達式自動計算出來。
    3. FullName不會佔用任何存儲空間(除非可能包含在索引中)。
+0

嗯,我認爲這會工作,我只是測試它,唯一的「問題」是有在名稱之間的FullName列中有很多空間。 – emo 2014-10-11 09:06:31

+0

@emo:Then'RTRIM(FirstName)'和'LTRIM(LastName)'。 MSDN參考頁:['LTRIM'](http://msdn.microsoft.com/en-us/library/ms177827.aspx),['RTRIM'](http://msdn.microsoft.com/en-us /library/ms178660.aspx) – stakx 2014-10-11 09:10:07

+0

stakx謝謝,它解決了間距問題。多謝你們。我很想提供一些贊成票,但我不能。 – emo 2014-10-11 09:13:36

1

而不是存儲連接值這兩個列(FistName和「名字」)的,這意味着每一個值(第一個姓或名)被存儲兩次(例如:先在FirstName柱然後在FullName列),你可以一個非持續computed column(需要SQL 2005+),因此使用:

CREATE TABLE #Persons (
    FirstName NVARCHAR(50) NOT NULL, 
    LastName NVARCHAR(50) NOT NULL, 
    FullName NVARCHAR(100) NOT NULL 
); 
INSERT #Persons VALUES ('A', 'B', '...') 
GO 

ALTER TABLE #Persons 
DROP COLUMN FullName 
GO 

ALTER TABLE #Persons 
ADD FullName AS (FirstName + ' ' + LastName) 
GO 

SELECT * FROM #Persons 
/* 
FirstName LastName FullName 
--------- -------- -------- 
A   B  A B 
*/ 

FullName計算列不使用的存儲空間連接值。

注:計算列具有強制SQL Server存儲計算值的選項PERSISTED

+0

謝謝,下次我將在我的腦海中創建表格和列。但是我正在研究其他一些數據庫,並且覺得不夠安全以改變這種情況,但是;)。 – emo 2014-10-11 09:27:56

+0

根據您提供的參考資料,似乎沒有必要添加然後刪除列。你爲什麼這樣做? – 2014-10-11 11:36:51

+0

@DanBracuk:我認爲表格[已經]存在。我用了一個溫度。表只是爲了演示,所以OP可以看到他/她可以{更改表的結構|將列更改爲計算列}而不刪除並重新創建此表。 – 2014-10-11 16:20:09

相關問題