1

2つのテーブルデータを新しいマージされたテーブルに転送するためのストアドプロシージャを作成しました。

  • 表1->OldUsersテーブル
  • 表2->ハンターテーブル
  • 表3->ユーザーテーブル

テーブル構造:

CREATE TABLE [dbo].[Users]
(
    [uid] [int] IDENTITY(1,1) NOT NULL,
    [username] [varchar](50) NULL,
    [password] [varchar](50) NULL,
    [state] [int] NULL,
    [name] [varchar](50) NULL,
    [license] [varchar](50) NULL,
    [lansno] [varchar](50) NULL,
    [curcuit_no] [varchar](50) NULL,
    [communism] [varchar](100) NULL,
    [Olduid] [int] NULL,
    [Is_hunter] [bit] NULL,
    [free_text] [text] NULL,
    [country] [varchar](50) NULL,
    [curcuit] [varchar](50) NULL,
    [license_territory] [varchar](50) NULL,
    [forest] [varchar](50) NULL,
    [association] [varchar](50) NULL,
    [hunt_ar] [varchar](50) NULL,
    [area] [varchar](50) NULL,
    [contract] [varchar](50) NULL,
    [radio_frequency] [varchar](50) NULL,

    CONSTRAINT [PK_timeuser] 
        PRIMARY KEY CLUSTERED ([uid] ASC)
)

データをインポートするためのストアドプロシージャを作成しました。しかし、私が通常実行するときは、ALL NULLS(テーブル全体がNULLSで埋められている)を渡します。その後、私は削除します

Where @uid = @index;   

その後、実行します。それから私はどこでも繰り返される1つのidを見ました。

ALTER PROCEDURE [dbo].[UserTransfer]
AS
    declare @OldUser_tbl_count int;
    declare @Hunters_tbl_count int;

    declare @index int;
    set @index = 1;

    declare @uid int;
    declare @usr varchar(50);
    declare @psw varchar(50);
    declare @stat int;
    declare @name varchar(50);
    declare @license varchar(50);
    declare @lansno varchar(50);
    declare @curcuit varchar(50);
    declare @commu varchar(100);
    declare @sid int;
    --declare @text text;
    declare @country varchar(50);
    declare @curc varchar(50);
    declare @terri varchar(50);
    declare @forest varchar(50);
    declare @assoc varchar(50);
    declare @hunt varchar(50);
    declare @area varchar(50); 
    declare @contract varchar(50);
    declare @radio varchar(50);
    declare @town varchar(100);
    declare @lans varchar(50);

    --SET @OldUser_tbl_count = (SELECT COUNT (*) from OldUsers)
    SELECT @OldUser_tbl_count = COUNT (*) from OldUsers;
    SELECT @Hunters_tbl_count = COUNT (*) from Hunters;

-- entering from OldUsers to Users tbl
while(@index <= @OldUser_tbl_count)
BEGIN
    Select @uid=OldUsers.uid , @usr=OldUsers.username , @psw=OldUsers.password , @stat=OldUsers.state,
@name = dbo.OldUsers.name, @license=OldUsers.license,@curcuit= OldUsers.curcuit_no,@commu= OldUsers.communism,@lans=OldUsers.lansno
FROM OldUsers 
Where @uid=@index;

INSERT INTO Users
Values (@usr,@psw,@stat,@name,@license,@lans,@curcuit,@commu,@uid,0,'','','','','','','','','','');

SET @index = @index+1;
END

-- entering from Hunters to Users tbl
While (@index <= @Hunters_tbl_count)
BEGIN
SELECT @uid=Hunters.id,@license=Hunters.licence,@name=Hunters.hunter,@country=Hunters.country,@curc=Hunters.circuit,
@terri=Hunters.licence_territory,@forest=Hunters.forest,@assoc=Hunters.association,@hunt=Hunters.hunt_ar,@area=Hunters.area,
@contract=Hunters.contract,@radio=Hunters.radio_frequency,@town=Hunters.town

From Hunters
Where @uid = @index;

INSERT INTO Users
VALUES      ('','','',@name,@license,'','',@town,@uid,1,'',@country,@curc,@terri,@forest,@assoc,@hunt,@area,@contract,@radio);

SET @index=@index+1;
END

-exec UserTransfer  
4

4 に答える 4

1

WHILEの使用は避けてください。パフォーマンスが大幅に低下します。これは、CURSORを使用するようなものです。この場合、INSERT INTO ...SELECTを使用することをお勧めします。カーソルをINSERTINTO... SELECT句に置き換える方法の詳細については、PinalDaveのこのリンクを確認してください。

詳細については、 MicrosoftMSDNのWebサイトを確認してください

于 2012-05-23T09:42:41.507 に答える
0

古いユーザーWhere @uid=@index;に変更OldUsers.uid

Where @uid = @index;Hunters.idハンター に

于 2012-05-23T09:52:24.947 に答える
0

この2つのインサートを試していただけませんか?

INSERT INTO Users
Select username, [password], [state], name, license, lansno, curcuit_no, communism, [Uid], 0 ,'','','','','','','','','',''
FROM OldUsers 

INSERT INTO Users
SELECT '', '', '', Hunter, licence, '', '', town, ID, 1, '', country, circuit, licence_territory, forest, association, hunt_ar, area, [contract], radio_frequency
From Hunters

レコードごとにデータを選択して挿入する代わりに、一度に行うことができます。SQLServerのドキュメントへのこのリンクを確認してください。

于 2012-05-23T09:57:50.933 に答える
0

別のアプローチを提案してもいいですか?

これを調整してみてください:

INSERT INTO Users 
select username, password,state, name, license, lansno, curcuit_no, communism, uid,0,'','','','','','','','','',''
from OldUsers

に挿入した後、列の名前を追加する必要がある場合があります

于 2012-05-23T10:33:19.903 に答える