0

私は3つのテーブルを持っています-

1. Country (CountryName, CID (PK- AutoIncrement))
2. State (SID(PK- AutoIncrement), StateName, CID (FK to Country)
3. City (CityName, CID, SID (FK to State)

次に、CountryName、StateName、および CityName を含む 3 つのテーブルに名前のみを挿入する必要があります。ID を更新する必要があります。

Create PROCEDURE sp_place(
    @CountryName char(50),
    @StateName  varchar(50),
    @CityName   nchar(20)
    )
AS
DECLARE @CountryID int, @StateID int, @CityID int;

Set NOCOUNT OFF

BEGIN TRANSACTION

INSERT INTO dbo.Country VALUES (@CountryName);
SET @CountryID = SCOPE_IDENTITY();

IF @@ERROR <> 0 
BEGIN     
ROLLBACK     
RETURN 
END 

Insert into dbo.State VALUES (@StateName, @CountryID);
SET @StateID = SCOPE_IDENTITY();
IF @@ERROR <> 0 
BEGIN     
ROLLBACK     
RETURN 
END 

Insert into dbo.City VALUES (@CityName, @StateID);
SET @CityID= SCOPE_IDENTITY();

Commit

国を 2 回入力しても、値は変更されません。例: インドに CountryID=1 の値を入力した場合、インドに再度入力したときに、CountryID の値が増加することはありません。

どうやってそれを実行したのですか?挿れるたびにSPが変化する。

4

4 に答える 4

2

国がすでに存在するかどうかを確認し、countryIDを取得できます

IF NOT EXISTS(Select 1 FROM Country Where CountryName=@Country)
BEGIN
    INSERT INTO dbo.Country VALUES (@CountryName);
    SET @CountryID = SCOPE_IDENTITY();
END
ELSE
    Select @CountryID = CountryID From Country Where CountryName=@Country

State必要にCity応じて同じことを行うことができます

于 2012-07-24T09:49:19.847 に答える
1
Hello try with this syntax

IF EXISTS (SELECT * FROM Country WHERE CountryName= @CountryName)
BEGIN
    UPDATE dbo.Country
    SET CountryName = @CountryName
    WHERE   CountryId = (SELECT CountryId FROM dbo.Country WHERE CountryName= @CountryName);
END
ELSE
BEGIN
   INSERT INTO dbo.Country(CountryName) VALUES (@CountryName);

END

-- For the identity you must just add identity to your column in your creation script
于 2012-07-24T09:44:01.480 に答える
0

MERGE構文が必要です

http://technet.microsoft.com/en-us/library/bb510625.aspx

IF EXISTS (...)または、挿入する前に国の存在を手動で(つまり、withで)確認します。

于 2012-07-24T09:40:12.197 に答える
0

重複する国をまったく挿入できないCountryName列に一意性制約を設定しないのはなぜですか

于 2012-07-24T09:43:29.483 に答える