2017-03-12 3 views
0

更新は機能しているようですが、解析名関数を使用して挿入する必要もあります。挿入を使用して別のテーブルの列をユーザー定義関数で更新する方法クロス適用

INSERTクエリ内の関数を使用する方法

UPDATE P 
SET 
    P.First_Name = T.ForeName 
    ,P.Middle_Name = T.Middle_Name 
    ,P.Last_name = T.Surname 
FROM GMUnitTest.dbo.Contact1 C 
INNER JOIN PCUnitTest.dbo.People P 
    ON P.People_ID = C.Key4 
CROSS APPLY dbo.NameParser(C.Contact) T 
WHERE C.Key1 = '76-ENR' 
AND P.PEOPLE_ID = C.KEY4 

を動作しているようだ--the更新機能。これはこれまで私が試みてきたことです。エラーが表示されます。 "クロスの近くに不正な構文"

INSERT INTO  SISUnitTest.dbo.PEOPLE p (p.LAST_NAME, p.FIRST_NAME, p.LAST_NAME) 
SELECT   T.ForeName, T.Middle_Name, T.Surnname 
FROM    CONTACT1 c 
WHERE  (c.KEY1 = p.PEOPLE_ID); 
CROSS APPLY dbo.NameParser(c.Contact) T 
WHERE p.PEOPLE_ID = c.KEY4 

答えて

0

ERPise。

あなたは実際に誤解のように見えるだけでなく、ここでいくつかの構文エラーがあります。

まず、あなたのクエリが2つのWHERE句があります。

FROM    CONTACT1 c 
WHERE  (c.KEY1 = p.PEOPLE_ID); --1 
CROSS APPLY dbo.NameParser(c.Contact) T 
WHERE p.PEOPLE_ID = c.KEY4 --2 

EAKチームはまた、あなたの悩みを与えるセミコロンに関する権利です。元のエラーメッセージでした。その向こう

、あなたはPとしてエイリアスにを試してみましたSISUnitTest.dbo.PeopleINSERTを行っています。重複しているWHERE句の結合条件は、PCUnitTest.dbo.People AS Pだった元の更新クエリのテーブルの単純なコピー&貼り付けのようですので、これらの条件が適切ではないかと思います。 SISUnitTest.dbo.PeopleにはPCUnitTest.dbo.Peopleと同じフィールドがありますか?何がしたいことはSISUnitTest.dbo.PeoplePCUnitTest.dbo.PeopleGMUnitTest.dbo.Contact1から挿入するのであれば

、それは可能ですが、あなたはので、コメントアウトされている。このような何か(あなたのオリジナルラインのカップルにクエリを再構築する必要があるとしています彼らは)彼らの間違いを持っ​​ているように見える:

--INSERT INTO SISUnitTest.dbo.PEOPLE p (p.LAST_NAME, p.FIRST_NAME, p.LAST_NAME) 
INSERT INTO SISUnitTest.dbo.People (First_Name,Middle_Name,Last_Name) 
SELECT 
    T.ForeName 
    ,T.Middle_Name 
    ,T.Surname 
FROM GMUnitTest.dbo.Contact1 C 
INNER JOIN PCUnitTest.dbo.People P 
    ON P.People_ID = C.Key4 
CROSS APPLY dbo.NameParser(C.Contact) T 
WHERE C.Key1 = '76-ENR' 
; 
--AND P.PEOPLE_ID = C.KEY4 
--This condition is already included in the INNER JOIN three lines up 

あなたは同じリストがPCUnitTest.dbo.PeopleなどGMUnitTest.dbo.Contact1の両方に存在することを確認するためにそれを使用している場合を除きこれは、この形式では、INNER JOINはすべてが、無用であることは注目に値します。それが問題でない場合は、単にこのクエリからINNER JOINを削除することができます。

注意あなたのdbo.NameParser()関数は常に3行(ForeName、Middle_Name、Surname)を返すようです。このような場合、INSERTステートメントでこのように使用すると、解析するすべての名前に対して3つの行が挿入される可能性が高くなります。

以前の回答で示唆したように、dbo.NameParserに2番目のパラメータを追加して、名前の特定の部分を要求できるようにすることをお勧めします。これにより、単一の行を挿入することができます。

INSERTを除いて、上記のクエリの一部だけを実行して、いくつかのランダムなエントリに返される内容を確認することをお勧めします。私は、あなたが私が何を話しているのを見ることを期待しています。

+0

ありがとう、はい私はt-sqlを使用した最後の時間90年代になると2005年にクロス・アプライが追加されました。その文字列'76 -ENR 'には3つのマッチがあるので3行戻ってくると思います。キーを追加して3行戻ってくるかどうかを確認します。また、これは挿入および更新トリガーで使用されるいくつかのコードです。だから、私はスクリプトでコードをテストする方法を見つけていない。私はいくつかのテストコードを書き続け、それを挿入するように変更します。 WHERE C.Key1 = '76 -ENR ' AND P.PEOPLE_ID = C.KEY4 – ERPISE

+0

挿入されたテーブルを参照するスクリプトを実行すると、メッセージに「無効なオブジェクト名が挿入されました」というメッセージが表示されます。挿入されたテーブルをテストスクリプトで使用するコードをテストする方法はありますか、それともプロセス内で実行する唯一の方法ですか? iは INNER P.People_ID ON PCUnitTest.dbo.People P をJOIN挿入FROM INSERT INTO SISUnitTest.dbo.People(FIRST_NAME、MIDDLE_NAME、LAST_NAME) T.ForeName、T.Middle_Name 、T.Surname を選択 = i.Key4 CROSS適用dbo.NameParser(i.Contact)T WHERE i.Key1 = '76 -ENR ' AND P.PEOPLE_ID = i.KEY4 – ERPISE

+0

@ERPise「Inserted」テーブルを使用しませんでした。あなたが「トリガー」について話していなかったので、私の質問。これが 'TRIGGER'の場合は、クエリが異なります。 'TRIGGER'のコメントに投稿したクエリには何も問題はありませんが、同じクエリをスタンドアロンで実行することはできません。なぜなら、' Inserted'テーブルを参照できるようにすることはできないからです。それを通常のクエリとして実行するだけです。これは 'TRIGGER'ですか、それとも通常のクエリですか? – 3BK

0

現在地の近くに構文エラーがあります。ここから

INSERT INTO  SISUnitTest.dbo.PEOPLE p (p.LAST_NAME, p.FIRST_NAME, p.LAST_NAME) 
SELECT   T.ForeName, T.Middle_Name, T.Surnname 
FROM    CONTACT1 c 
WHERE  (c.KEY1 = p.PEOPLE_ID); //right here 
CROSS APPLY dbo.NameParser(c.Contact) T 
WHERE p.PEOPLE_ID = c.KEY4 

削除セミコロン:(c.KEY1 = p.PEOPLE_ID); < - このセミコロン

+0

ありがとう、それはまだ間違った構文をクロス適用の近くに表示する、私はテストテーブルとペーストビンのデータを持っているhttp://pastebin.com/vqW3s6mK – ERPISE

関連する問題