4

ちょっとした趣味で SQL Server を独学しています。リレーショナル テーブルにデータを挿入する作業に行き詰まりました。リレーショナル テーブルの概念は理解しています。

以前に挿入された行の ID を変数として取得して、残りのクエリで FK として使用する方法を誰かに教えてもらえないかと思っていました。

ここに私のTSQLコードがあります:

CREATE PROCEDURE [dbo].[q_insertuser]
@username varchar(50),
@hash varchar(MAX),
@name varchar(50),
@email varchar(MAX),
@address varchar(MAX),
@city varchar(50),
@postcode varchar(50)

AS
--INSERT USERNAME
    INSERT INTO tab_user
    (username)
    VALUES
    (@username)

    --Selects the Userid to be used
DECLARE @UID INT
SET @UID = INT FOR SELECT *
                     FROM tab_user
                     WHERE (userid = SCOPE_IDENTITY())

--INSERT PASSWORD
    INSERT INTO tab_pass
    (userid, hash)
    VALUES
    (@UID ,@hash)

--INSERT Address
    INSERT INTO tab_contact
    (userid,name, email, address, city, postcode)
    VALUES
    (@UID ,@name, @email, @address, @city, @postcode)
--RETURN 0

私がオンラインで見た例は、このようにやっているようですが、VSから典型的な不可解なエラーが発生しています

(76,1): SQL72014: .Net SqlClient データ プロバイダー: メッセージ 207、レベル 16、状態 1、プロシージャ q_insertuser、行 19 列名 'userid' が無効です。
バッチの実行中にエラーが発生しました。

ただし、列名 userid は、クエリしているテーブルに存在します。

4

1 に答える 1

5

この部分を交換

DECLARE @UID INT
SET @UID = INT FOR SELECT *
                     FROM tab_user
                     WHERE (userid = SCOPE_IDENTITY())

これとともに

DECLARE @UID INT
SET @UID =  SCOPE_IDENTITY()

getdate() や db_name() と同様に、SCOPE_IDENTITY() 関数を変数に直接割り当てることができます。

于 2013-07-07T12:59:03.283 に答える