2013-05-01 86 views
1

我正在尋找MSSQL 2005觸發器的正確​​語法,該觸發器將拆分一列的值並更新其他四列。需要SQL觸發器根據破折號分隔符拆分字符串

  • 數據庫:TestDB
  • 表:UploadAppTable

之前

|OriginalFile     | EmployeeID | EmployeeTitle | Location | ApplicationID 
|0146291-ITDCCT-02-1367413404 |   |    |   | 

我需要什麼,如果以下。當新記錄被插入時,我需要SQL觸發器來更新表格。

輸出

|OriginalFile     | EmployeeID | EmployeeTitle | Location | ApplicationID 
|0146291-ITDCCT-02-1367413404 | 0146291 | ITDCCT  | 02  | 1367413404 

任何幫助將不勝感激。

+0

說實話,我從來沒有寫過更新聲明,將更新多列。所以我需要建議,所以我可以嘗試一些。我還沒有嘗試過任何東西。 – user2066533 2013-05-01 15:25:54

+0

看起來像「CHARINDEX」是要用分隔符分割字符串的方法。我只是不知道正確的語法。我還需要將其添加到SQL觸發器。 – user2066533 2013-05-01 15:36:43

+2

*** SQL ***只是*結構化查詢語言* - 許多數據庫系統使用的語言,但不是數據庫產品...類似於觸發器的事物是高度**特定於供應商的 - 因此我們真的需要了解您正在使用的**數據庫系統**(以及哪個版本)(請相應地更新標籤).... – 2013-05-01 15:50:09

回答

0

分隔這些值可以使用dbo.SplitStrings_CTE功能

CREATE FUNCTION dbo.SplitStrings_CTE(@List nvarchar(max), @Delimiter nvarchar(1)) 
RETURNS @returns TABLE(val nvarchar(max), [level] int, PRIMARY KEY CLUSTERED([level])) 
AS 
BEGIN 
;WITH cte AS 
(
    SELECT SUBSTRING(@List, 0, CHARINDEX(@Delimiter, @List)) AS val, 
     CAST(STUFF (@List + @Delimiter, 1, CHARINDEX(@Delimiter, @List), '') AS nvarchar(max)) AS stval, 
     1 AS [level] 
    UNION ALL 
    SELECT SUBSTRING(stval, 0, CHARINDEX(@Delimiter, stval)), 
     CAST(STUFF (stval, 1, CHARINDEX(@Delimiter, stval), '') AS nvarchar(max)), 
     [level] + 1 
    FROM cte 
    WHERE stval != '' 
) 
    INSERT @returns 
    SELECT REPLACE(val, ' ', '') AS val, [level] 
    FROM cte 
    RETURN 
END 

創建功能後,使用UPDATE語句

;WITH cte AS 
( 
    SELECT t.OriginalFile, t.EmployeeID, t.EmployeeTitle, t.Location, t.ApplicationID, 
     NewEmployeeID = MAX(CASE WHEN o.level = 1 THEN o.val END) OVER(), 
     NewEmployeeTitle = MAX(CASE WHEN o.level = 2 THEN o.val END) OVER(), 
     NewLocation = MAX(CASE WHEN o.level = 3 THEN o.val END) OVER(), 
     NewApplicationID = MAX(CASE WHEN o.level = 4 THEN o.val END) OVER() 
    FROM dbo.UploadAppTable t CROSS APPLY dbo.SplitStrings_CTE(t.OriginalFile, '-') o 
) 
    UPDATE cte 
    SET EmployeeID = NewEmployeeID, 
     EmployeeTitle = NewEmployeeTitle, 
     Location = NewLocation, 
     ApplicationID = NewApplicationID 

演示上SQLFiddle

或UPDATE語句的多重更新

;WITH cte AS 
( 
    SELECT t.OriginalFile, t.EmployeeID, t.EmployeeTitle, t.Location, t.ApplicationID, 
     NewEmployeeID = MAX(CASE WHEN o.level = 1 THEN o.val END) OVER(PARTITION BY t.OriginalFile), 
     NewEmployeeTitle = MAX(CASE WHEN o.level = 2 THEN o.val END) OVER(PARTITION BY t.OriginalFile), 
     NewLocation = MAX(CASE WHEN o.level = 3 THEN o.val END) OVER(PARTITION BY t.OriginalFile), 
     NewApplicationID = MAX(CASE WHEN o.level = 4 THEN o.val END) OVER(PARTITION BY t.OriginalFile) 
    FROM dbo.UploadAppTable t CROSS APPLY dbo.SplitStrings_CTE(t.OriginalFile, '-') o 
) 
    UPDATE cte 
    SET EmployeeID = NewEmployeeID, 
     EmployeeTitle = NewEmployeeTitle, 
     Location = NewLocation, 
     ApplicationID = NewApplicationID 

演示SQLFiddle

+0

嗨@Alexander Fedorenko非常感謝您的幫助。功能和更新聲明的工作,但現在我有問題,每當添加一個新的條目。它會更新我以前的最新作品。嘗試了[SQLFiddle](http://sqlfiddle.com/#!3/25a7e/1/2) – user2066533 2013-05-02 18:56:41

+1

它的工作原理,我只需要在我的FROM後添加一個where語句。 – user2066533 2013-05-02 20:12:23

+0

歡迎來到StackOverflow!如果您需要多個UPDATE語句,請將PARTITION BY t.OriginalFile表達式添加到OVER()子句中。答覆已更新;) – 2013-05-03 04:39:45

0

你想要做類似OriginalFile.Split('-')的東西,對不對?可悲的是,在SQL Server中沒有可用的內部字符串分割,您將不得不推出自己的。隨後,Erland Sommarskog爲每個人都省下了不必擔心的問題,因爲有些優秀的文章可以找到,您可以找到here

+0

謝謝@Steve Pettifer。我會在你上一篇文章中關注這個鏈接。我想知道你將如何處理串聯的對立面。將破折號分隔的字符串拆分成數據行。 – user2066533 2013-05-01 16:09:55

+0

錯......這就是我剛發佈的!級聯很容易,但這裏沒有關係。你想根據給定的分隔符來分割一個字符串。我的一小塊僞​​代碼('OriginalFile.Split(' - ')')實際上是有效的.Net語法,它證明了我相信你想要做的事情。我的觀點是,在T-SQL中沒有內在的功能,也沒有與數組等價的功能。因此,您必須創建自己的函數來分割字符串並返回值或使用諸如表值參數之類的東西。 – 2013-05-01 16:20:45