0

次のクエリは失敗しませんが、一意の値も挿入されません。

一意の値のみを挿入したい

DECLARE @user_id AS varchar(80) 
DECLARE @real_name as varchar(250) 

-- 新しい一意の値は「aaa」であり、ターゲット テーブルに存在しません。

SET @user_id = 'aaa'
SET @real_name = 'aaa'

INSERT INTO TargetTable
  ([user_id],real_name)
SELECT @user_id, @real_name
WHERE NOT EXISTS
  (SELECT [user_id],real_name FROM TargetTable)
4

4 に答える 4

1

挿入に問題がある場合は、次のような別のアプローチを試してください。

-- if the count of records with that @user_id and @real_name is less or equal to 0, 
-- that means it's not in the table
IF (0 >= (SELECT COUNT(*) FROM TargetTable WHERE @user_id = [user_id] AND @real_name = [real_name]))
BEGIN
   -- then call a normal insert
   INSERT
     INTO TargetTable ([user_id], real_name )
   VALUES             (@user_id , @real_name)

END
于 2012-05-11T18:59:54.833 に答える
0

クエリが行を挿入する唯一の方法は、データベースに「aaa」、「aaa」を含む行がまだない場合です。

ほら、あなたはやっている

SELECT 'aaa','aaa'
WHERE NOT EXISTS
(SELECT [user_id],real_name FROM TargetTable)

したがって、その'aaa','aaa'結果セットは、ターゲット テーブルにあるすべての行の列 user_id および real_name によって形成される結果セットを「マイナス」または「除外」します。

したがって、'aaa'、'aaa' が 2 番目の結果セットに既に存在する場合、最終的な結果セットから除外されるため、挿入されません。

于 2012-05-11T18:50:32.537 に答える
0

誰かがまだ気にかけている場合、または後でこの質問を見る場合... .

元の問題は、OP が、特定の行ではなく、ターゲット テーブルに存在する行WHERE NOT EXISTSチェックする句を使用したことでした。必要なのは、挿入するデータを確認することだけです。

DECLARE @user_id AS varchar(80)  
DECLARE @real_name as varchar(250)  

 --New Unique values are "aaa" and they do not exist in the target table
SET @user_id = 'aaa' 
SET @real_name = 'aaa' 

INSERT INTO TargetTable 
  ([user_id],real_name) 
SELECT @user_id, @real_name 
WHERE NOT EXISTS 
  ( SELECT 42 FROM TargetTable WHERE [user_id] = @user_id AND real_name = @real_name )

(現在)受け入れられている回答は、TRANSACTION. クエリ間で変更が発生すると、不快な結果になる可能性があります。

于 2012-05-11T19:57:18.610 に答える
0

これは、user92546 さんの懸念に対処するためのものです。挿入は、TargetTable を照会する同じクエリ内で行われます。唯一の副選択は変数に対するものであり、テーブルは任意のマイクロ秒で変更される可能性がありますが、これらは明らかにこの挿入の過程で変更されません。

DECLARE @user_id AS varchar(80)  
DECLARE @real_name as varchar(250)  

 --New Unique values are "aaa" and they do not exist in the target table
SET @user_id = 'aaa' 
SET @real_name = 'aaa' 

INSERT INTO TargetTable ([user_id],real_name) 
SELECT T1.user_id, T1.real_name 
FROM (select @user_id [user_id], @real_name [real_name] ) T1
LEFT JOIN TargetTable T2
   on T1.user_id = T2.user_id
     and t1.real_name = T2.real_name
     and T2.user_id = @user_id
     and T2.real_name = @real_name
WHERE T2.user_id is null
于 2012-05-11T21:06:33.887 に答える