質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

3回答

3038閲覧

SQLServerを使ったINSERT文について

kswdfr

総合スコア21

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2019/11/20 00:14

編集2019/11/20 01:39

Microsoft SQL Server Management Studio 18で

SQLServer

1SELECT IDENT_CURRENT('KEYWORD')

でIDENTITY 列の現在の値を取得しています。
テーブルに他のテーブルのIDENTITY 列の現在の値を取得して格納したく

SQLerver

1INSERT INTO [dbo].[IMAGEKEYWORD](ImageID, Keyword) 2SELECT IDENT_CURRENT('IMAGE','KEYWORD')//'IMAGE'と'KEYWORD'は IDENTITY 列で別々のテーブルにあります。

で実行すると

Error

1Msg 174, Level 15, State 1, Line 2 2The ident_current function requires 1 argument(s). 3

と表示されて続行できません。

SQLServer

1INSERT INTO [dbo].[IMAGEKEYWORD](ImageID, Keyword) 2SELECT IDENT_CURRENT('IMAGE')SELECT IDENT_CURRENT('KEYWORD')

で実行すると

Error

1Msg 120, Level 15, State 1, Line 1 2The select list for the INSERT statement contains fewer items than the insert list. The number of SELECT values must match the number of INSERT columns.

が表示され実行できません。
どうしたら実行できるか教えてください。

開発環境

Microsoft SQL Server Management Studio 18

検索

どのように検索したらよいかわからないので検索していません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

エラーメッセージそのままだと思いますが。
英語がわからなければ翻訳するWebサービスもあります。
Google翻訳しました。

The ident_current function requires 1 argument(s).

ident_current関数には1つの引数が必要です。

The select list for the INSERT statement contains fewer items than the insert list. The number of SELECT values must match the number of INSERT columns.

INSERTステートメントの選択リストには、挿入リストよりも少ないアイテムが含まれています。 SELECT値の数は、INSERT列の数と一致する必要があります。

投稿2019/11/20 01:15

workaholist

総合スコア559

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

SCOPE_IDENTITY() を使ってはいかがですか?

以下のクエリの例は Visual Studio が自動生成したものですが、ProductID が IDENTITY 列です。

INSERT INTO [Products] ([ProductName] ...) VALUES (@ProductName ... ); SELECT ProductID, ProductName ... FROM Products WHERE (ProductID = SCOPE_IDENTITY())";

投稿2019/11/20 01:07

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kswdfr

2019/11/20 01:31

INSERT INTO [Products] ([ProductName] ...) VALUES (@ProductName ... ); SELECT ProductID, ProductName ... FROM Products WHERE (ProductID = SCOPE_IDENTITY())"; ではなくINSERTとSELECTをい1文で実行したいです。 ProductIDが IDENTITY 列のテーブルとProductNameが IDENTITY 列のテーブルをSELECTで取得したいです。
退会済みユーザー

退会済みユーザー

2019/11/20 01:55

> ProductIDが IDENTITY 列のテーブルとProductNameが IDENTITY 列のテーブルをSELECTで取得したいです。 意味が分かりません。もっと具体的に説明ください。 上の回答のコード例は、INSERT 操作によって SQL Server が生成する ProductID (IDENTTITY 列)の値を間違いなく取得するにはこの方法がベストということです。以下の記事に書いてあるように @@IDENTITY とか IDENT_CURRENT がありますが、上の INSERT 操作によって生成された値かどうかは保証の限りではないはずです。 IDENT_CURRENT (Transact-SQL) https://docs.microsoft.com/ja-jp/sql/t-sql/functions/ident-current-transact-sql?view=sql-server-ver15
kswdfr

2019/11/20 03:15 編集

CREATE TABLE [dbo].[GENRE] ( [NameID] INT IDENTITY (1, 1) NOT NULL, [Nmae] NVARCHAR (50) NULL, CONSTRAINT [NUM1] PRIMARY KEY CLUSTERED ([NameID] ASC) ); CREATE TABLE [dbo].[GENRE] ( [SportsID] INT IDENTITY (1, 1) NOT NULL, [Sports] NVARCHAR (50) NULL, CONSTRAINT [NUM1] PRIMARY KEY CLUSTERED ([SportsID] ASC) ); というテーブルがありNameIDとSportsIDそれぞれの現在の値を取得して別のテーブルに格納したいです。
退会済みユーザー

退会済みユーザー

2019/11/20 02:28

上の CREATE 文は全く変ですが、そこはちょっと置いといて、回答にあった、 INSERT INTO [dbo].[IMAGEKEYWORD](ImageID, Keyword) SELECT IDENT_CURRENT('IMAGE')SELECT IDENT_CURRENT('KEYWORD') を以下のようにしたらどうなりますか? 試して結果を連絡いただければと思います。 INSERT INTO [dbo].[IMAGEKEYWORD](ImageID, Keyword) SELECT IDENT_CURRENT('IMAGE'), IDENT_CURRENT('KEYWORD')
kswdfr

2019/11/20 05:07

INSERT INTO [dbo].[IMAGEKEYWORD](ImageID, Keyword) SELECT IDENT_CURRENT('IMAGE'), IDENT_CURRENT('KEYWORD') で試したら Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the FOREIGN KEY constraint "NUM6". The conflict occurred in database "・・・", table "dbo.KEYWORD", column 'KeywordID'. The statement has been terminated. というエラーが発生して実行できませんでした。
退会済みユーザー

退会済みユーザー

2019/11/20 05:17

そもそもがクエリの問題ではなくて、外部キー制約がかかっていて、勝手な値は入れられないようになっているということではないのですか?
kswdfr

2019/11/20 05:51

CREATE TABLE [dbo].[IMAGEKEYWORD] ( [ImageID] INT NOT NULL, [Keyword] INT NOT NULL, CONSTRAINT [NUM5] PRIMARY KEY CLUSTERED ([ImageID] ASC, [Keyword] ASC), CONSTRAINT [NUM6] FOREIGN KEY ([Keyword]) REFERENCES [dbo].[KEYWORD] ([KeywordID]) ); テーブルに格納したいです。 外部キー制約がかかっているところは勝手な値ではなくSELECT IDENT_CURRENT('KEYWORD')で取得して格納します。
退会済みユーザー

退会済みユーザー

2019/11/20 07:28 編集

だからそれが外部キー制約に引っかかる勝手な値ではないのですか? 外部キー制約など私の言ってること理解できてます? エラーメッセージは conflicted with the FOREIGN KEY constraint "NUM6" と言ってますが、読んでますか?
kswdfr

2019/11/20 08:29

IDENTITY 列の現在の値を外部キーを設定した列に入れることは出来ないという事ですか?
workaholist

2019/11/20 08:35

外部キー制約違反の意味がわからないということですか?
退会済みユーザー

退会済みユーザー

2019/11/20 08:38 編集

エラーメッセージは外部キー制約に矛盾すると言ってるだけ。どう矛盾してるかはあなたが調べる他無いかと。もしくはエスパーのような回答者の出現を待つとか・・・
kswdfr

2019/11/20 09:35

外部キー制約はわかっていますがIDENTITY 列の現在の値を外部キーを設定した列に入れるということはテーブルに格納しているIDを取得するという事だからエラーが発生しないと僕は思います。 なのにエラーが発生する理由がわからないので教えてください。
退会済みユーザー

退会済みユーザー

2019/11/20 12:31

原因切り分けのための努力をしませんか? それが一番容易にできる環境にいるのが質問者さんなのですから。他人に期待しないでやってみてください。
kswdfr

2019/11/20 13:17

SELECT IDENT_CURRENT('KEYWORD')で確認したらテーブルに存在しない値を格納しようとしていたので DBCC CHECKIDENT(テーブル名, RESEED, セットする値) でIDENTITY列の現在値を格納している最後の値に変更したら格納できました。 教えてくださりありがとうございました。 そして知識不足で申し訳ございません。
guest

0

マニュアルを確認する習慣を身に着けましょう。INSERT ... SELECT 構文

投稿2019/11/20 00:36

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kswdfr

2019/11/20 00:46

INSERT ... SELECT 構文を確認しました。 しかしどのように変更したらうまく実行できるかわからないので教えてください。
Orlofsky

2019/11/20 01:17 編集

SELECT を2つ書いていることに気が付けませんか?INSERTされるのカラム数とSELECTされるカラム数が対応できていますか? SQL入門レベルのスキルが浅過ぎるんです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問