2015-07-10 25 views
0

下面的SQL Server 2008的查詢解析一個名字列到單獨第一,中間和最後一個名稱部分,和工作得很好命令的表:更新通過所使用SELECT

SELECT 
    LEFT(Name, CHARINDEX(' ', Name)) AS FirstName, 
    CASE WHEN CHARINDEX(' ', Name) <> LEN(Name) - CHARINDEX(' ', REVERSE(Name)) + 1 THEN 
     SUBSTRING(Name, CHARINDEX(' ', Name)+ 1, LEN(Name) - CHARINDEX(' ', REVERSE(Name))-CHARINDEX(' ', Name)) end as MiddleName, 
    RIGHT(Name, CHARINDEX(' ', REVERSE(Name))) AS LastName 
FROM a01_parse_test 

我現在需要存儲(FirstName,MiddleNameLastName)放入我的表格(a01_parse_test)。我該怎麼做?

+0

你想做什麼樣的編輯?你想改變'Name'字段的個別部分嗎?你試過什麼'UPDATE'查詢? – cxw

+0

當您使用SELECT運行上面的命令時,它會顯示正確的解析出的名稱,但就是這樣。我希望修改後的查詢能夠使用分割名稱實際更新表格。 – Sal

+0

只需檢查 - 您沒有選擇更改模式以在單獨的列中列出名稱部分? :)什麼SQL服務器?例如,在Microsoft上,請參閱https://msdn.microsoft.com/en-us/library/ms177561.aspx中有關字符串連接的示例 – cxw

回答

0

編輯 可以在(每this)的UPDATE聲明直接使用的功能。假設你已經列NameFirstNameMiddleNameLastName在你的餐桌:

UPDATE a01_parse_test 
SET FirstName=LEFT(Name, CHARINDEX(' ', Name)), 
    MiddleName=CASE WHEN CHARINDEX(' ', Name) <> LEN(Name) - CHARINDEX(' ', REVERSE(Name)) + 1 THEN 
     SUBSTRING(Name, CHARINDEX(' ', Name)+ 1, LEN(Name) - CHARINDEX(' ', REVERSE(Name))-CHARINDEX(' ', Name)) END, 
    LastName=RIGHT(Name, CHARINDEX(' ', REVERSE(Name))) 

如果您的表不存在這些列,你需要使用ALTER TABLE添加它們:

ALTER TABLE a01_parse_test 
ADD FirstName VARCHAR(50) NULL, 
    MiddleName VARCHAR(50) NULL, 
    LastName VARCHAR(50) NULL 
+0

不要以爲這些會起作用。如果名稱部分在一個字段中,我想加入他們來創建一個完整的名稱,然後是...或者用另一個值替換值,然後是,但是我擁有的是名爲NAME的列。還有一些名爲firstname,middlename和lastname的列是空的。運行上述TSQL我提供它有效地解析全名到它的部分......但只在查看窗格中由於SELECT語句。我需要的是表更新(firstname字段的名字等)基本上我需要我的命令實際上更改物理表不只是在視圖窗格中。 – Sal

+0

所以你實際上是在試圖解析一個記錄的組合Name字段,並將結果存儲在同一個表的同一記錄中的單獨字段中? – cxw

+0

準確地說:-)我提供的TSQL就是這樣做的,但只在查看窗格中沒有以任何方式實際改變數據。那部分沒有我。 – Sal

1

似乎您想要更新只有Name的原始來源表格,並對FirstName,MiddleNameLastName進行了明顯更改。如果是這樣,我會考慮在源表上創建一個視圖來標準化分割名稱的邏輯,然後在視圖上使用INSTEAD OF UPDATE在視圖上添加TRIGGER以處理更新。

下面

完整的示例:

IF OBJECT_ID('a01_parse_test') IS NULL BEGIN 
    CREATE TABLE a01_parse_test (Id INT PRIMARY KEY NOT NULL IDENTITY(1,1), Name VARCHAR(500)) 
    INSERT a01_parse_test VALUES 
     ('Barack Hussein Obama'), 
     ('George Walker Bush'), 
     ('William Jefferson Clinton'), 
     ('Ronald Wilson Reagan') 
END 

IF OBJECT_ID('v_ParseNames') IS NOT NULL 
    DROP VIEW v_ParseNames 
GO 

CREATE VIEW v_ParseNames 
AS 
    SELECT 
     Id, -- Whatever the id is of your parsing table 
     LEFT(Name, CHARINDEX(' ', Name)) AS FirstName, 
     CASE WHEN CHARINDEX(' ', Name) <> LEN(Name) - CHARINDEX(' ', REVERSE(Name)) + 1 
      THEN SUBSTRING(Name, CHARINDEX(' ', Name)+ 1, LEN(Name) - CHARINDEX(' ', REVERSE(Name))-CHARINDEX(' ', Name)) 
      END AS MiddleName, 
     RIGHT(Name, CHARINDEX(' ', REVERSE(Name))) AS LastName 
    FROM a01_parse_test 
GO 

-- Create instead of update trigger on the view to update names separately 
CREATE TRIGGER tg_v_ParseNames_Update ON v_ParseNames 
INSTEAD OF UPDATE AS BEGIN 
    UPDATE TGT SET 
     Name = SRC.FirstName 
      + (CASE WHEN LEN(SRC.MiddleName) > 0 THEN ' ' + SRC.MiddleName ELSE '' END) 
      + ' ' + SRC.LastName 
    FROM a01_parse_test TGT 
     INNER JOIN INSERTED SRC 
      ON SRC.Id = TGT.Id 
END 
GO 

SELECT * FROM v_ParseNames WHERE Id = 3 
UPDATE v_ParseNames SET FirstName = 'Bill' WHERE Id = 3 
SELECT * FROM v_ParseNames WHERE Id = 3 

變化所以之前

Id   FirstName  MiddleName  LastName 
----------- --------------- --------------- --------------- 
1   Barack   Hussein   Obama 
2   George   Walker   Bush 
3   William   Jefferson  Clinton 
4   Ronald   Wilson   Reagan 

UPDATE語句則可以只更新第一個名字:

UPDATE v_ParseNames SET FirstName = 'Bill' WHERE Id = 3 

更新語句跑,然後進行:

Id   FirstName  MiddleName  LastName 
----------- --------------- --------------- --------------- 
3   Bill   Jefferson  Clinton