2

私は現在、あるテーブルから別のテーブルにデータをインポートするプロジェクトに取り組んでいます。FULLNAMEを含むフィールドをLAST、FIRST、MIの部分に解析しようとしています。名前はすべて「LAST、FIRSTMI」の形式です。必要に応じて結果を正しく解析して返すストアドプロシージャを作成しましたが、ストアドプロシージャを単一のselectステートメントに組み込む方法がわかりません。たとえば、現在私が持っているもの:

SELECT FULLNAME From UserInfo

そして私が欲しいのはこのようなものです:

SELECT Last, First, MI from UserInfo

現在、私のストアドプロシージャは、ParseName(FULLNAME、Last as OUTPUT、First as OUTPUT、MI as OUTPUT)の形式を取ります。このプロシージャを呼び出して、出力変数を3つの異なる列に分割するにはどうすればよいですか?

4

3 に答える 3

1

次のように、ストアドプロシージャの結果を(一時的な)テーブルに配置できます(FULLNAME結合条件を提供するために列を追加しました。これを行うには、ストアドプロシージャを調整する必要があります)。

CREATE TABLE #temp (
  FULLNAME NVARCHAR(..)
  ,Last NVARCHAR(..)
  ,First NVARCHAR(..)
  ,MI NVARCHAR(..)
);

INSERT INTO #temp (Last, First, MI)
EXECUTE MySproc;

構造的に実行できるようにするSELECT Last, First, MI from UserInfo場合は、最初に名前情報用にUserInfoに3つの列を追加してから、ストアドプロシージャから取得した解析済みデータを挿入する必要があります。

編集

を使用しSELECT ... INTO ...てデータを新しいテーブルに配置するとおっしゃいました。新しいテーブルには列がないと推測しているのでFULLNAME、テーブル値関数を使用する方がよいでしょう(この回答が示唆しているように)。ただし、列を保持している場合FULLNAMEは、それを使用して一時テーブルを新しいテーブルと結合し、次のように新しいテーブルを更新できます。

UPDATE NUI
  SET NUI.Last = T.Last, NUI.First = T.First, NUI.MI = T.MI
  FROM NewUserInfo AS NUI
  INNER JOIN #temp AS T ON NUI.FULLNAME = T.FULLNAME;

UPDATE新しいテーブルに列がない場合は、別の結合条件でもこのメソッドを使用できますFULLNAMEが、事前に適切なテストを実行して、結合が成立するかどうかを確認してください。

これがお役に立てば幸いです。

于 2012-09-28T10:28:14.997 に答える
1

ストアドプロシージャをテーブル値関数に置き換えます。その後、この関数をすべての行に適用できます。

以下に例を示します-名前を解析するためのロジックを配置するだけです

create FUNCTION dbo.f_parseName(@inFullName varchar(255))
RETURNS 
    @tbl TABLE (lastName varchar(255), firstName varchar(255), middleName varchar(255))
as
BEGIN
-- put your logic here
insert into @tbl(lastName,firstName,middleName)
select substring(@inFullName,0,10),substring(@inFullName,11,10), substring(@inFullName,21,10)

return

end

関数を適用します

-- sample data
declare @fullNames table (fullName varchar(255))
insert into @fullNames (fullName) values
('111111111122222222223333333333')
,('AAAAAAAAAABBBBBBBBBBCCCCCCCCCC')


select 
    fn.fullName
    ,pn.lastName
    ,pn.firstName
    ,pn.middleName
from 
    @fullNames fn
    cross apply dbo.f_parseName(fn.fullName) pn
于 2012-09-28T12:11:21.677 に答える
0

次のように、計算列をテーブルに追加できます。

alter table UserInfo
    add firstName as SUBSTRING(fullName, CHARINDEX(',',fullName,0)+2, LEN(fullName)-CHARINDEX(',',fullName,0)-CHARINDEX(' ', REVERSE(fullName),0)-1)
        ,lastName as SUBSTRING(fullName, 0, CHARINDEX(',',fullName,0))
        ,middleInitital as REVERSE(SUBSTRING(REVERSE(fullName),0,CHARINDEX(' ', REVERSE(fullName),0)))

しかし、最善の解決策は、その逆を行うことです。の実列でデータを正規化しfirstName、の計算列を実行します。lastNamemiddleInitialfullName

上記のコードの式は、より効果的に記述できると確信しているため、もう少し作業が必要になる場合があります。私は彼らにアイデアを示すためだけに働かせました。

計算列を作成した後、次のようにすることができます。

select  firstName
        ,lastName
        ,middleInitital
from UserInfo
于 2012-09-28T10:59:08.470 に答える