2011-08-31 11 views
-3

私はこれをSubStringとPatIndexを使って解決できました。みんな、ありがとう。分割名機能パフォーマンス改善

ソリューション:

UPDATE TableX 
    SET  
     firstname = Substring(fullname, 1, Charindex(' ', fullname) - 1), 
     lastname = Substring(fullname, (Len(fullname) - Patindex(
     '%[ ' + CHAR(8) + ']%',Reverse(fullname)) + 1) +1,Len(fullname) - 
     (Len(fullname) -  Patindex('%[ ' + CHAR(8) + ']%',Reverse(fullname))+ 1)) 
WHERE ID = @ID 
     AND fullname IS NOT NULL 
     AND firstname = ''  

オリジナル質問:

マイスプリット名称機能が姓と名を分割することができます。

問題は、私が得るために二度同じ機能を実行する必要があるということです。

  • 姓を取得するための第二のパス。

1回のパスで同じ最終結果を達成する方法はありますか?

UPDATE TableX 
SET FirstName = dbo.ufn_SplitName(FullName,'fs'), 
Lastname = dbo.ufn_SplitName(FullName,'ln') 
WHERE Id = @ID AND FullName IS NOT NULL AND FirstName = '' 



CREATE FUNCTION [dbo].[ufn_SplitName] 
( 
    @pInput VARCHAR(150), 
    @TypeOfSplit VARCHAR(2) 
) 

RETURNS NVARCHAR(MAX) 
AS 
BEGIN 

DECLARE @FINALOUTPUT AS VARCHAR(150) 
DECLARE @FirstSpace as int 


-- Determine the Number of spaces 
SET @FirstSpace = CHARINDEX(' ',@pInput) 

-- Get FirstName 
if @TypeOfSplit = 'fs' 
SET @FINALOUTPUT = LEFT(@pInput,@FirstSpace) 
-- Last Name Does not exist so first name is the only value 
if @TypeOfSplit = 'fs' AND @FirstSpace = 0 
SET @FINALOUTPUT = @pInput 

-- Get last Name 
if @TypeOfSplit = 'ln' AND @FirstSpace > 0 
SET @FINALOUTPUT = RIGHT(@pInput, CHARINDEX(' ', REVERSE(@pInput)) - 1) 
-- Last Name does not exist 
if @TypeOfSplit = 'ln' AND @FirstSpace = 0 
SET @FINALOUTPUT = '' 

return @FINALOUTPUT 
+3

。 –

+0

これは99%の時間で動作します。 –

+0

あなた自身の答えで、あなたは元の質問を解決していません。私ははるかに滑らかなソリューションを提供していると私は元の質問を解決しても、あなたは自分のソリューションに固執する。 –

答えて

2

あなたのコードの詳細に入るがなければ、あなたは、姓と名のそれぞれの列を単一の行を返すテーブル値関数であることを、それを変更することができます。クエリ内のテーブル値関数にJOINを設定して、クエリのこれらの列を使用できます。

関連する問題