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