2016-07-08 14 views
-2

文字列の最初の名前を独自の値として解析または分割する関数を作成するためのヘルプを使用できます。私はこれを行うコードを持っていますが、これを関数に変換するスキルはありません。ここで私はそれがテストされていているコードで、自分自身で正常に動作します:誰もが、私はそれを大幅にいただければ幸いです機能にこれを変換するのに役立つ可能性が文字列の姓名を解析/分割するT-SQL関数

SELECT 
    CASE WHEN 0 = CHARINDEX(' ',StageThree.REST_OF_NAME) 
     THEN StageThree.REST_OF_NAME --No space? return the whole thing 
     ELSE SUBSTRING(StageThree.REST_OF_NAME, 1, CHARINDEX(' ',StageThree.REST_OF_NAME)-1) 
     END AS FirstName 

      FROM 
      (SELECT 
       --if the first three characters are in this list, 
       --then pull it as a "StageThree". otherwise return NULL for StageThree. 
       CASE WHEN SUBSTRING(StageTwo.FullName,1,3) IN ('MR ','MS ','DR ','MRS') 
        THEN LTRIM(RTRIM(SUBSTRING(StageTwo.FullName,1,3))) 
        ELSE NULL 
    END AS Title 

    --if you change the list, don't forget to change it here, too. 
    --so much for the DRY prinicple... 
,CASE WHEN SUBSTRING(StageTwo.FullName,1,3) IN ('MR ','MS ','DR ','MRS') 
     THEN LTRIM(RTRIM(SUBSTRING(StageTwo.FullName,4,LEN(StageTwo.FullName)))) 
     ELSE LTRIM(RTRIM(StageTwo.FullName)) 
     END AS REST_OF_NAME 
,StageTwo.OriginalName 

FROM 
    (SELECT 
    --trim leading & trailing spaces before trying to process 
    --disallow extra spaces *within* the name 
    REPLACE(REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(Contact)),' ',' '),' ',' '),',',' '),'.',' ') AS FullName 
    ,Contact AS OriginalName 
    FROM 
    My.dbo.database 
) StageTwo 
) StageThree 

場合。もし私がこれに助けを得ることができれば、(関数として)最後の名前を得るためのコードも投稿します。

このコードは正しいと思われますが、私のクエリでは起動できません。

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER FUNCTION [dbo].[FirstName](@input VARCHAR(100)) --how ever many you  need 
RETURNS @returnTable table(FirstName varchar(100)) 

AS 

BEGIN 
INSERT INTO @returnTable (FirstName) 
SELECT 

    CASE WHEN 0 = CHARINDEX(' ',StageThree.REST_OF_NAME) 
     THEN StageThree.REST_OF_NAME --No space? return the whole thing 
     ELSE SUBSTRING(StageThree.REST_OF_NAME, 1, CHARINDEX(' ',StageThree.REST_OF_NAME)-1) 
     END AS FirstName 

      FROM 
      (SELECT 
       --if the first three characters are in this list, 
       --then pull it as a "StageThree". otherwise return NULL for StageThree. 
       CASE WHEN SUBSTRING(StageTwo.FullName,1,3) IN ('MR ','MS ','DR ','MRS') 
        THEN LTRIM(RTRIM(SUBSTRING(StageTwo.FullName,1,3))) 
        ELSE NULL 
        END AS Title 

    --if you change the list, don't forget to change it here, too. 
    --so much for the DRY prinicple... 
,CASE WHEN SUBSTRING(StageTwo.FullName,1,3) IN ('MR ','MS ','DR ','MRS') 
     THEN LTRIM(RTRIM(SUBSTRING(StageTwo.FullName,4,LEN(StageTwo.FullName)))) 
     ELSE LTRIM(RTRIM(StageTwo.FullName)) 
     END AS REST_OF_NAME 

FROM 
    (SELECT 
    --trim leading & trailing spaces before trying to process 
    --disallow extra spaces *within* the name 
    REPLACE(REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(@Input)),' ',' '),' ',' '),',',' '),'.',' ') AS FullName 

) StageTwo 
) StageThree 
RETURN 
+0

なぜこれが関数に変換することは困難です。あなたは機能に関する文書を読んだのですか? – Hogan

+0

Googleを使用している場合、これに関するインターウェブに関する多くのリソースがあります。 – dfundako

+0

これを_covert_funciton_にしようとするあなたの試みを示し、あなたがどのような問題を持っているのかを示してください。 – HABO

答えて

0

を必要としています。約束どおり、私は姓のコードも掲載しています。これらのどちらも絶対的なものではなく、これは特定のアプリケーション用にカスタマイズされています(したがって、NULL値の代わりに「空白」という用語が使用されます)。しかし、単一の文字列として収集されたデータを名字を必要とするシステムに移動する必要がある状況がある場合、これはかなりうまくいくでしょう。あなたが名前を持つ他の注意点のいくつかを克服するためのアイデアを思いついた場合、共有してください。

助けを借りてくれたscimimonに感謝します!

CREATE FUNCTION [dbo].[getFirstName](@input VARCHAR(100)) 
RETURNS VARCHAR(100) 

AS 

BEGIN 
DECLARE @Result as Varchar(100) 
SET @Result = (
SELECT 

    CASE WHEN 0 = CHARINDEX(' ',StageThree.REST_OF_NAME) 
     THEN StageThree.REST_OF_NAME --No space? return the whole thing 
     ELSE SUBSTRING(StageThree.REST_OF_NAME, 1, CHARINDEX(' ',StageThree.REST_OF_NAME)-1) 
     END AS FirstName 

      FROM 
      (SELECT 
       --if the first three characters are in this list, 
       --then pull it as a "StageThree". otherwise return NULL for StageThree. 
       CASE WHEN SUBSTRING(StageTwo.FullName,1,3) IN ('MR ','MS ','DR ','MRS') 
        THEN LTRIM(RTRIM(SUBSTRING(StageTwo.FullName,1,3))) 
        ELSE NULL 
        END AS Title 

    --if you change the list, don't forget to change it here, too. 
    --so much for the DRY prinicple... 
,CASE WHEN SUBSTRING(StageTwo.FullName,1,3) IN ('MR ','MS ','DR ','MRS') 
     THEN LTRIM(RTRIM(SUBSTRING(StageTwo.FullName,4,LEN(StageTwo.FullName)))) 
     ELSE LTRIM(RTRIM(StageTwo.FullName)) 
     END AS REST_OF_NAME 

FROM 
    (SELECT 
    --trim leading & trailing spaces before trying to process 
    --disallow extra spaces *within* the name 
    REPLACE(REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(@Input)),' ',' '),' ',' '),',',' '),'.',' ') AS FullName 

) StageTwo 
) StageThree) 
RETURN @Result 
END 

およびLastName機能:

CREATE FUNCTION [dbo].[getLastName](@input VARCHAR(100)) 
RETURNS VARCHAR(100) 
AS 

BEGIN 
DECLARE @Result as Varchar(100) 
SET @Result = (


SELECT 

    CASE WHEN SUBSTRING(StageFour.REST_OF_NAME, 1 + CHARINDEX(' ',StageFour.REST_OF_NAME),LEN(StageFour.REST_OF_NAME)) IN ('jr','sr','II','III','IV') 
     THEN SUBSTRING(StageFour.REST_OF_NAME, 1 , CHARINDEX(' ',StageFour.REST_OF_NAME)-1) + ' ' + 
      SUBSTRING(StageFour.REST_OF_NAME, 1 + CHARINDEX(' ',StageFour.REST_OF_NAME),LEN(StageFour.REST_OF_NAME)) 
     WHEN SUBSTRING(StageFour.REST_OF_NAME, 1 + CHARINDEX(' ',StageFour.REST_OF_NAME),LEN(StageFour.REST_OF_NAME)) IS NULL THEN '(BLANK)' 
     ELSE SUBSTRING(StageFour.REST_OF_NAME, 1 + CHARINDEX(' ',StageFour.REST_OF_NAME),LEN(StageFour.REST_OF_NAME)) 
     END AS LastName 

FROM 
     (SELECT 
     StageThree.Title 
     ,CASE WHEN 0 = CHARINDEX(' ',StageThree.REST_OF_NAME) 
      THEN StageThree.REST_OF_NAME --No space? return the whole thing 
      WHEN StageThree.REST_OF_NAME IS NULL THEN '(Blank)' 
      ELSE SUBSTRING(StageThree.REST_OF_NAME, 1, CHARINDEX(' ',StageThree.REST_OF_NAME)-1) 
      END AS FirstName 
     ,CASE WHEN 0 = CHARINDEX(' ',StageThree.REST_OF_NAME) 
      THEN NULL --no spaces @ all? then 1st name is all we have 
      ELSE SUBSTRING(StageThree.REST_OF_NAME, CHARINDEX(' ',StageThree.REST_OF_NAME)+1, LEN(StageThree.REST_OF_NAME)) 
      END AS REST_OF_NAME 
     ,StageThree.FullName 
       FROM 
       (SELECT 
        --if the first three characters are in this list, 
        --then pull it as a "StageThree". otherwise return NULL for StageThree. 
        CASE WHEN SUBSTRING(StageTwo.FullName,1,3) IN ('MR ','MS ','DR ','MRS') 
         THEN LTRIM(RTRIM(SUBSTRING(StageTwo.FullName,1,3))) 
         ELSE NULL 
     END AS Title 

     --if you change the list, don't forget to change it here, too. 
     --so much for the DRY prinicple... 
    ,CASE WHEN SUBSTRING(StageTwo.FullName,1,3) IN ('MR ','MS ','DR ','MRS') 
      THEN LTRIM(RTRIM(SUBSTRING(StageTwo.FullName,4,LEN(StageTwo.FullName)))) 
      ELSE LTRIM(RTRIM(StageTwo.FullName)) 
      END AS REST_OF_NAME 
    ,StageTwo.FullName 
    FROM 
     (SELECT 
     --trim leading & trailing spaces before trying to process 
     --disallow extra spaces *within* the name 
     REPLACE(REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(@Input)),' ',' '),' ',' '),',',' '),'.',' ') AS FullName 

    ) StageTwo 
    ) StageThree 
) StageFour 
) 

RETURN @Result 
END 
1

あなたは、私は、以下に示すスカラー関数、としてこれを書き換えることができたいくつかのより多くの試行の後、表値関数

CREATE FUNCTION schema.your_function_name(@parameter datatype()) --how ever many you need 
RETURNS @returnTable table(
TheTitle varchar(256), 
REST_OF_NAME varchar(256), 
OriginalName varchar(256) 
) 

AS 

BEGIN 
INSERT INTO @returnTable (TheTitle, REST_OF_NAME, OriginalName) 
SELECT 
...your code... 
RETURN 
END 
+0

ありがとう、これは、関数の作成に役立ちました。私はそれを私の質問で動かすだけです。私はHELPFULの答えに感謝します。 –

+1

'SELECT * FROM dbo.your_function(varible1、varible2) ' – scsimon

+0

私のAh-Haの瞬間。これは、スカラー関数とはまったく異なります。だから私はそれを理解できなかった。助けてくれてありがとう! –

関連する問題