2017-11-17 11 views
0

マッピングテーブル(BcwmWDConfig)を読み込み、古いデータベース(BCWM99)の古いテーブル(Items)の値を別のデータベースの新しいテーブル(WebDET99.dbo.Items)に挿入/更新するコードスニペットを書きました。スカラー変数がカーソル内で宣言されていないのはなぜですか?

私はおそらく私が宣言した(少なくとも私はそう思った)変数は宣言されていないというエラーを受けています。

DECLARE @v_bcwm_id INT = 0, 
     @v_wd_guid VARCHAR = ''; 

DECLARE bcwm_config_read_cursor CURSOR FOR 
    SELECT c.id, c.guid 
    FROM BcwmWDConfig c 
    WHERE c.guid IS NOT NULL; 


PRINT '----READING CONFIG----'; 

OPEN bcwm_config_read_cursor 

FETCH NEXT FROM bcwm_config_read_cursor INTO @v_bcwm_id, @v_wd_guid 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT '----READ CONFIG FOR ID: '[email protected]_bcwm_id+' AS GUID '[email protected]_wd_guid+'----' 
    PRINT '----INSERTING ITEMS WITH PARENT GUID: '[email protected]_wd_guid+'----' 

    INSERT INTO WebDET99.dbo.Items 
     SELECT 
      i.Id, i.Text, 
      CAST(@v_wd_guid AS VARCHAR(50)), 
      CAST(i.Linked_Feld AS VARCHAR(50)), 
      i.Linked_Item, i.Order 
     FROM 
      BCWM99.dbo.Items i 
     WHERE 
      i.Parent_Feld = @v_bcwm_id 

    PRINT '----INSERTED ITEMS WITH PARENT GUID: '[email protected]_wd_guid+'-----' 

    FETCH NEXT FROM bcwm_config_read_cursor INTO @v_bcwm_id, @v_wd_guid 
END 

CLOSE bcwm_config_read_cursor; 
DEALLOCATE bcwm_config_read_cursor; 

SET @v_bcwm_id = 0, @v_wd_guid = ''; 

OPEN bcwm_config_read_cursor 
FETCH NEXT FROM bcwm_config_read_cursor 
INTO @v_bcwm_id, @v_wd_guid 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT '----READ CONFIG FOR ID: '[email protected]_bcwm_id+' AS GUID '[email protected]_wd_guid+'----' 
    PRINT '----UPDATING ITEMS WITH LINKED FIELD: '[email protected]_wd_guid+'----' 
    UPDATE WebDET99.dbo.Items i 
     SET i.Linked_Feld = @v_wd_guid 
     WHERE i.Parent_Feld = CAST(@v_bcwm_id AS VARCHAR(50)) 
    PRINT '----UPDATED ITEMS WITH LINKED FIELD: '[email protected]_wd_guid+'-----' 
    FETCH NEXT FROM bcwm_config_read_cursor 
    INTO @v_bcwm_id, @v_wd_guid 
END 
CLOSE bcwm_config_read_cursor; 
DEALLOCATE bcwm_config_read_cursor; 

SET  @v_bcwm_id = 0, 
     @v_wd_guid = ''; 

なぜカーソルの中で宣言されていませんか?また、私は自分のコードでいくつかの小さな構文エラーがあると確信していますが、私はSQL Serverに慣れていない、多分誰かがこの手順でいくつかの他の問題を見つける。

+0

質問に誤ってカーソルを2回貼り付けていたのですか、それとも実際に使用していますか? –

+0

エラーメッセージとは何ですか?クイックメモ、更新は挿入できない可能性があります。既存のレコードを更新している場合は、同じカーソルループで更新してください。また、int変数を出力するときに、これらをvsrcharsにキャストする必要があるかもしれません。 –

+0

実行時にテキスト全体を強調表示していますか? –

答えて

0

あなたのコードはsysntactically不正確です。

最初のエラー:

SELECT 
    i.Id, i.Text, 
    CAST(@v_wd_guid AS VARCHAR(50)), 
    CAST(i.Linked_Feld AS VARCHAR(50)), 
    i.Linked_Item, i.[Order] -----------------------------square brackets! 

2番目のエラー:あなたは角括弧なしOrder(予約語)を使用することはできません

SET @v_bcwm_id = 0, @v_wd_guid = ''; 

は次のようになります。

SET @v_bcwm_id = 0; set @v_wd_guid = ''; ------------the same in the last row 

最後のエラー: "i"を取り除く:

UPDATE WebDET99.dbo.Items 
SET Linked_Feld = @v_wd_guid 
WHERE Parent_Feld = CAST(@v_bcwm_id AS VARCHAR(50)) 

コードのみをコンパイルできます。

+0

私はそれを試して、うまくいくかどうかをチェックします –

関連する問題