如果表不存在则创建表

时间:2009-10-05 14:20:36

标签: sql sql-server sql-server-2005 tsql transactions

鉴于以下内容:

if object_id('MyTable') is null create table MyTable( myColumn int )

两个单独的调用者是否都不可能将object_id('MyTable')评估为null,因此两者都尝试创建表。

显然,该场景中的两个调用者中的一个会失败,但理想情况下没有调用者会失败,而是一个应该阻塞而另一个应该创建表,然后被阻塞的调用者将看到object_id('MyTable')为非null并且继续进行。

我可以应用什么独占锁定,这样我就不会锁定超过绝对要求?

4 个答案:

答案 0 :(得分:2)

在初始检查之后,在创建表时使用try catch,如果错误是表已经存在,那么继续,如果没有,则会出现更大的问题

答案 1 :(得分:1)

通常CREATE TABLE从设置和安装脚本运行,并且期望安装脚本允许从单独的连接进行并发安装是不合理的。

我建议您使用在安装/升级过程开始时获得的会话scopped应用锁,请参阅sp_getapplock

答案 2 :(得分:0)

我不认为,你应该担心这个。

DDL语句不在事务下运行。此外,如果表已经是由来自第一个呼叫者的呼叫创建的,则第二个呼叫者将失败。

答案 3 :(得分:0)

我不允许用户创建表格。一般来说,这是一种不好的做法。如果他们需要插入数据,表格已经存在。如果你担心两个人创建同一个表,你还担心他们的数据是否正在交叉?我不知道你的proc会做什么,但是如果表格存在然后插入那么它就像删除记录那样,那么如果两个用户同时在线,那么你可能会有奇怪的结果。但一般来说,如果您需要在运行时创建ea表,通常表明您的设计需要工作。