处理"Insert Into TABLE Values()"语句中的标识列?

Jam*_*hon 33 sql t-sql database sql-server identity

在SQL Server 2000或更高版本中,当使用如下语句时,无论如何都要处理自动生成的主键(标识)列?

Insert Into TableName Values(?, ?, ?)
Run Code Online (Sandbox Code Playgroud)

我的目标是根本不使用列名.

Eri*_*ric 58

默认情况下,如果你有一个标识列,你就不会需要在值部分指定它.如果你的表是:

ID    NAME    ADDRESS
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

INSERT INTO MyTbl VALUES ('Joe', '123 State Street, Boston, MA')
Run Code Online (Sandbox Code Playgroud)

这将为您自动生成ID,您根本不必考虑它.如果您SET IDENTITY_INSERT MyTbl ON,您可以为ID列分配值.

  • 哦真的吗?这真是太好了。我只是认为这行不通。让我试试。 (2认同)

Aar*_*and 27

生成列列表的另一个"技巧"就是将"列"节点从对象资源管理器拖到查询窗口中.

  • +1这个对我帮助很大.除了方形括号的发脾气. (3认同)

A-K*_*A-K 11

最佳做法是明确列出列:

Insert Into TableName(col1, col2,col2) Values(?, ?, ?)
Run Code Online (Sandbox Code Playgroud)

否则,如果向表中添加其他列,则原始插入将中断.


Mit*_*eat 6

你有2个选择:

1)指定列名列表(不带标识列).

2)SET IDENTITY_INSERT tablename ON,后跟为标识列提供显式值的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, '')
Run Code Online (Sandbox Code Playgroud)