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列分配值.
A-K*_*A-K 11
最佳做法是明确列出列:
Insert Into TableName(col1, col2,col2) Values(?, ?, ?)
Run Code Online (Sandbox Code Playgroud)
否则,如果向表中添加其他列,则原始插入将中断.
你有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)