2017-06-08 9 views
0

カーソルを使用して、1つのテーブル(Family_tree)のデータを2つの他のテーブル(Family_tree1 + @time、Family_tree2 + @time)にランダムにコピーしています。コードは正常に実行されますが、行は更新されません。実際にテーブルからコピーするものがあります。 Microsoft SQL Server Management Studioを使用しています。カーソル付きスクリプトの部分は次のとおりです。T-SQLのカーソルが機能しない

---creating two tables beforehand 
DECLARE @random int 
DECLARE 
@first_name nvarchar(20), 
@last_name AS nvarchar(20), 
@date_of_birth AS nchar(10), 
@date_of_death AS nchar(10), 
@place_of_death AS nvarchar(30), 
@credit_card AS nchar(16), 
@ID_member AS int, 
@FK_gender AS nchar(3), 

DECLARE curs CURSOR FOR SELECT first_name, last_name, date_of_birth, date_of_death, place_of_death, credit_card, ID_member, FK_gender, FROM Family_tree 
OPEN curs 

FETCH NEXT FROM curs INTO @first_name, @last_name, @date_of_birth, @date_of_death, @place_of_death, @credit_card, @ID_member, @FK_gender, 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @random = RAND() * 1000000 
    IF @random % 2 = 1 
    BEGIN 
     SET @sqlString = 'INSERT INTO [Family_tree1' + @time + '] (first_name, last_name, date_of_birth, date_of_death, place_of_death, credit_card, ID_member, FK_gender) 
    VALUES (' 
    + @first_name + ',' + @last_name + ',' + @date_of_birth + ',' + @date_of_death + ',' + @place_of_death + ',' + @credit_card + ',' 
    + CAST(@ID_member AS nvarchar) +','+ @FK_gender + ')' 
    END 
    ELSE 
    BEGIN 
    SET @sqlString = 'INSERT INTO [Family_tree2' + @time + '] (first_name, last_name, date_of_birth, date_of_death, place_of_death, credit_card, ID_member, FK_gender) 
    VALUES (' + @first_name + ',' + @last_name + ',' + @date_of_birth + ',' + @date_of_death + ',' + @place_of_death + ',' + @credit_card + ',' 
    + CAST(@ID_member AS nvarchar) +','+ @FK_gender + ')' 
END 
EXECUTE(@sqlString) 
FETCH NEXT FROM curs INTO @first_name, @last_name, @date_of_birth, @date_of_death, @place_of_death, @credit_card, @ID_member, @FK_gender 
END 
CLOSE curs 
DEALLOCATE curs 
END;  

私はT-SQLを初めて使用しており、助言をいただけると嬉しいです! ありがとうございます(:

+0

なぜこのためにカーソルが必要ですか?あなたの意見は何ですか?あなたは何を期待していますか? –

+1

ある表から別の表にデータをコピーすることは、カーソルなしで簡単に**できます。 –

+2

そして、これが失敗する理由は、文字列を構築する変数のうちの1つ以上が 'NULL'と' CONCAT_NULL_YIELDS_NULL'を含んでいるため、文字列全体が 'NULL'になります。 –

答えて

1

カーソルで "持っている"場合は、ヌルを注意する必要があります。文字列を使用していることに注意する必要があります。 VALUES句に挿入されたときを引用する代わりに

VALUES (' + @first_name + ', 

をあなたのようなものが必要です。

VALUES (' + COALESCE('''' + REPLACE(@first_name,'''','''''') + '''','NULL') + ', 

残りの値についても同様です。これは、値内の任意の一重引用符を二重引用符で置き換えた後、一重引用符で全体の文字列をラップします。 NULLはその処理のすべてを生き延びますので、COALESCEを使用して、最終的な文字列のNULLNULLリテラルに置き換えてください。

怒りの中でカーソルを実行する前に、この行を1行だけ実行して、文字列を実行するのではなく、それを印刷して「正しいと思う」ことを確認することをお勧めします。

より良いデータ型の使用を検討することをお勧めします。生年月日は文字列ではなく実際のdateという値で処理するほうがずっと良いでしょう。


グイドはCOALESCEに似ている、コメントでISNULLを示唆したが、いくつかの奇妙な制限があり、私は通常は使用しないことをお勧めします。彼らはまた、置換が空の文字列でなければならないことを示唆しましたが、ここではNULL値の位置にVALUES(... ,, ...)があり、エラーが発生します。

+0

このような明示的なアドバイスをありがとうございます!今はすべて正常に動作します。 – YanaSh

関連する問題