web-dev-qa-db-ja.com

「Table Values()に挿入」ステートメントでID列を処理しますか?

SQL Server 2000以降では、次のようなステートメントを使用するときに自動生成された主キー(ID)列を処理する方法がありますか?

Insert Into TableName Values(?, ?, ?)

私の目標は、列名をまったく使用しないことです。

32
James McMahon

デフォルトでは、ID列がある場合、not VALUESセクションで指定する必要があります。テーブルが次の場合:

ID    NAME    ADDRESS

その後、次のことができます。

INSERT INTO MyTbl VALUES ('Joe', '123 State Street, Boston, MA')

これにより、IDが自動生成されます。まったく考える必要はありません。もし、あんたが SET IDENTITY_INSERT MyTbl ON、ID列に値を割り当てることができます。

57
Eric

列リストを生成する別の「トリック」は、オブジェクトエクスプローラーからクエリウィンドウに「列」ノードをドラッグすることです。

25
Aaron Bertrand

ベストプラクティスは、列を明示的にリストすることです。

Insert Into TableName(col1, col2,col2) Values(?, ?, ?)

そうしないと、テーブルに別の列を追加すると元の挿入が壊れます。

11
A-K

次の2つの選択肢があります。

1)列名リストを指定します(ID列なし)。

2)SET IDENTITY_INSERT tablename ON、ID列に明示的な値を提供する挿入ステートメントが続き、SET IDENTITY_INSERT tablename OFFが続きます。

列名リストを避けている場合、おそらくこの「トリック」が役立つかもしれません:

-- Get a comma separated list of a table's column names
SELECT STUFF(
(SELECT 
',' + COLUMN_NAME AS [text()]
FROM 
INFORMATION_SCHEMA.COLUMNS
WHERE 
TABLE_NAME = 'TableName'
Order By Ordinal_position
FOR XML PATH('')
), 1,1, '')
6
Mitch Wheat

コメントにコードを入れるのは実用的ではないので、Ericの答えであなたのコメントに応えて、それはあなたのために働いていません...

私はSQL 2005ボックスで次のコマンドを実行しました(ごめん、便利な2000はありません)デフォルト設定でエラーなしで動作しました:

CREATE TABLE dbo.Test_Identity_Insert
(
    id  INT IDENTITY NOT NULL,
    my_string   VARCHAR(20) NOT NULL,
    CONSTRAINT PK_Test_Identity_Insert PRIMARY KEY CLUSTERED (id)
)
GO

INSERT INTO dbo.Test_Identity_Insert VALUES ('test')
GO

SELECT * FROM dbo.Test_Identity_Insert
GO

あなたはおそらくあなたの値リストでID値を送信していますか?実際に値を渡す場合、列を無視させることはできないと思います。たとえば、テーブルに6つの列があり、IDENTITY列を無視する場合、5つの値のみを渡すことができます。

2
Tom H
set identity_insert customer on
insert into Customer(id,Name,city,Salary) values(8,'bcd','Amritsar',1234)

「顧客」はテーブル名です

0
sohan yadav