SQL Server 2000以降では、次のようなステートメントを使用するときに自動生成された主キー(ID)列を処理する方法がありますか?
Insert Into TableName Values(?, ?, ?)
私の目標は、列名をまったく使用しないことです。
デフォルトでは、ID列がある場合、not VALUESセクションで指定する必要があります。テーブルが次の場合:
ID NAME ADDRESS
その後、次のことができます。
INSERT INTO MyTbl VALUES ('Joe', '123 State Street, Boston, MA')
これにより、IDが自動生成されます。まったく考える必要はありません。もし、あんたが SET IDENTITY_INSERT MyTbl ON
、ID列に値を割り当てることができます。
列リストを生成する別の「トリック」は、オブジェクトエクスプローラーからクエリウィンドウに「列」ノードをドラッグすることです。
ベストプラクティスは、列を明示的にリストすることです。
Insert Into TableName(col1, col2,col2) Values(?, ?, ?)
そうしないと、テーブルに別の列を追加すると元の挿入が壊れます。
次の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, '')
コメントにコードを入れるのは実用的ではないので、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つの値のみを渡すことができます。
set identity_insert customer on
insert into Customer(id,Name,city,Salary) values(8,'bcd','Amritsar',1234)
「顧客」はテーブル名です