1

1 つの列の値を分割し、他の 4 つの列を更新する MSSQL 2005 トリガーの正しい構文を探しています。

  • データベース: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

どんな助けでも大歓迎です。

4

2 に答える 2

0

のようなことをしたいですOriginalFile.Split('-')よね?残念ながら、SQL Server で使用できる固有の文字列分割はありません。独自の . 便利なことに、Erland Sommarskog は、ここで見つけることができるいくつかの優れた記事で、あまりにも心配しなければならないという問題をすべての人から救いました。

于 2013-05-01T15:55:13.460 に答える
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 のデモ

複数の更新の OR 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 のデモ

于 2013-05-01T16:26:24.280 に答える