我是SQL新手,這也許就是爲什麼我無法找到解決以下問題的原因。如何更新VARCHAR列,使其包含另外兩個由空格分隔的VARCHAR列的內容?
我有這個數據庫表中,所有列VARCHAR(50)
類型:
而且我想在FullName
更新價值觀,使他們的FirstName
和LastName
組合,由空格分隔。
這是我想與落得什麼:
我不想手動更新每一行。
我是SQL新手,這也許就是爲什麼我無法找到解決以下問題的原因。如何更新VARCHAR列,使其包含另外兩個由空格分隔的VARCHAR列的內容?
我有這個數據庫表中,所有列VARCHAR(50)
類型:
而且我想在FullName
更新價值觀,使他們的FirstName
和LastName
組合,由空格分隔。
這是我想與落得什麼:
我不想手動更新每一行。
我不想手動更新每一行。
我會告訴你兩個解決方案:
UPDATE
用一個語句列。這不是真的有這樣的麻煩:
UPDATE Names
SET FullName = FirstName + ' ' + LastName;
-- or: … = CONCAT(FirstName, ' ', LastName);
你說你所有的列被定義爲VARCHAR(50)
,因此要注意FirstName + ' ' + LastName
可以達到50 + 1 + 50 = 101個字符的最大長度。因此,FullName
可能被截斷:該列將只存儲前50個字符(或更少);如果有更多,他們會被扔掉。因此,您可能需要將FullName
重新定義爲VARCHAR(101)
。
或者,轉FullName
到計算列:
ALTER TABLE Names
DROP COLUMN FullName;
ALTER TABLE Names
ADD FullName AS (FirstName + ' ' + LastName);
此解決方案有三個顯着的優點:
FullName
不能頂撞FirstName
和LastName
,因爲它被自動導出(在查詢時)通過指定的表達式從它們中刪除。FullName
的類型; SQL Server根據表達式自動計算出來。FullName
不會佔用任何存儲空間(除非可能包含在索引中)。嗯,我認爲這會工作,我只是測試它,唯一的「問題」是有在名稱之間的FullName列中有很多空間。 – emo 2014-10-11 09:06:31
@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
stakx謝謝,它解決了間距問題。多謝你們。我很想提供一些贊成票,但我不能。 – emo 2014-10-11 09:13:36
而不是存儲連接值這兩個列(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
。
謝謝,下次我將在我的腦海中創建表格和列。但是我正在研究其他一些數據庫,並且覺得不夠安全以改變這種情況,但是;)。 – emo 2014-10-11 09:27:56
根據您提供的參考資料,似乎沒有必要添加然後刪除列。你爲什麼這樣做? – 2014-10-11 11:36:51
@DanBracuk:我認爲表格[已經]存在。我用了一個溫度。表只是爲了演示,所以OP可以看到他/她可以{更改表的結構|將列更改爲計算列}而不刪除並重新創建此表。 – 2014-10-11 16:20:09
你要提供代碼樣本? – dotnetom 2014-10-11 08:37:39
我幾乎嘗試了一切,從這篇文章中,http://stackoverflow.com/questions/22739841/sql-combine-two-columns-into-one-column – emo 2014-10-11 08:39:20
我不能刪除任何列,我必須有一個列兩個值合併在一起。 – emo 2014-10-11 08:41:16