39

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

Insert Into TableName Values(?, ?, ?)

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

4

6 に答える 6

68

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

ID    NAME    ADDRESS

次に、次のことができます。

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

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

于 2009-06-01T15:17:52.823 に答える
32

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

于 2009-06-01T15:42:07.653 に答える
11

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

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

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

于 2009-06-01T16:44:12.473 に答える
7

次の 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, '')
于 2009-06-01T15:14:26.400 に答える
2

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

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つの値しか渡すことができません。

于 2009-06-01T15:42:00.900 に答える
0
set identity_insert customer on
insert into Customer(id,Name,city,Salary) values(8,'bcd','Amritsar',1234)

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

于 2016-12-13T09:49:27.603 に答える