我有一个表管理员,只有一列,adminId是主键。由于业务规则,它必须是这样的。
我想一劳永逸地理解如何编写在这样的表中插入值的存储过程。我正在使用SQL Server和T-SQL并尝试使用SCOPE_IDENTITY(),但这不起作用,因为该表将INSERT_IDENTITY设置为false或关闭。
我真的不想插入虚拟值只是为了能够插入新行。谢谢!
答案 0 :(得分:129)
如果您有一个IDENTITY列,请执行此操作
INSERT MyTable DEFAULT VALUES; --allows no column list. The default will be the IDENTITY
SELECT SCOPE_IDENTITY();
如果您没有身份,那么您可以设置它吗?这是最好的方法..并使用上面的SQL。
如果没有,您想要插入新行
INSERT MyTable (admidid)
OUTPUT INSERTED.admidid --returns result to caller
SELECT ISNULL(MAX(admidid), 0) + 1 FROM MyTable
注意:
答案 1 :(得分:1)
您需要将IDENTITY_INSERT添加到您的select语句中:
SET IDENTITY_INSERT MyTable ON
INSERT INTO MyTable
(AdminCol)
SELECT AdminColValue
FROM Tableb
完成后,请务必记得
SET IDENTITY_INSERT MyTable OFF
以下是对BOL的工作原理的详细说明:http://msdn.microsoft.com/en-us/library/aa259221(SQL.80).aspx
答案 2 :(得分:0)
@Phil:你的意思是你的表有两(2)列,自动增量PK列和AdminName列吗?如果它只有一个AdminName所在的列,则AdminName是PK,当然不能自动增加字符串。业务规则是否希望您将完全限定的Windows用户名作为主键?这是可行的并且有意义,因为那样您就不需要AdminName列上的备用唯一索引。
但是如果你的表有两列,而不是一列:
在SQLServer中,自动增量是表/列定义的一部分。您将列定义为整数,然后将其定义为 标识列,指定增量,通常为1,但它可以是2或5或10或其他。要插入一行,只需插入其他列(s)值,不对PK列执行任何操作:
insert into T
(foo) -- column(s) list
values('bar') -- values list
执行插入操作的存储过程可以使SCOPE_IDENTITY成为RETURN值,或者SCOPE_IDENTITY可以作为OUT参数传递回客户端。
P.S。 SCOPE_IDENTITY()返回当前作用域中最近生成的自动增量标识值;它不会生成下一个标识值。
编辑:
据推测,您的Administrators表包含一组管理员。但是,如果除了整数主键列之外没有任何列,则无法识别管理员;你唯一能做的就是将它们相互区分开来。这根本不会让你走得太远。但是,如果您的Administrator表具有以下任一结构:
ID INTEGER PRIMARY KEY AUTOINCREMENT
windowsusername varchar(50) (unique index)
OR
windowsusername varchar(50) primary key
您可以从其他表中引用管理员表,并且外键将是有意义的。而这恰恰是由单个整数列组成的表缺乏 - 意义。
有两列,您可以使用存储过程执行此操作:
insert into Administrators
(windowsusername)
values('mydomain\someusername');
return SCOPE_IDENTITY();
并且您的客户端程序将作为返回值返回自动生成并自动生成并分配给新插入行的自动增量ID。这种方法是通常的做法,我甚至可以说它被认为是“最佳实践”。
P.S。你提到如果你“没有任何要插入的内容”,你就不知道如何“插入一个值”。那里有一个矛盾。如果您没有要插入的内容,为什么要插入?如果您对客户一无所知,为什么要创建一个新的CUSTOMER记录呢?不是他们的名字,他们的城市,他们的电话号码,什么都没有?