如何在 Sybase (TSQL) 中有条件地创建表?
好的,所以 Sybase (12.5.4) 将允许我执行以下操作来删除已存在的表:
IF EXISTS (
SELECT 1
FROM sysobjects
WHERE name = 'a_table'
AND type = 'U'
)
DROP TABLE a_table
GO
但是,如果我尝试对表创建执行相同操作,我总是会收到警告该表已存在,因为它继续进行并尝试创建我的表并忽略条件语句。 只需尝试运行以下语句两次,您就会明白我的意思:
IF NOT EXISTS (
SELECT 1
FROM sysobjects
WHERE name = 'a_table'
AND type = 'U'
)
CREATE TABLE a_table (
col1 int not null,
col2 int null
)
GO
运行上面的语句会产生以下错误:
(本地主机)上的 SQL Server 错误 错误:2714,行:7 消息:有 已经有一个名为“a_table”的对象 数据库。
这是怎么回事?!
OK, so Sybase (12.5.4) will let me do the following to DROP a table if it already exists:
IF EXISTS (
SELECT 1
FROM sysobjects
WHERE name = 'a_table'
AND type = 'U'
)
DROP TABLE a_table
GO
But if I try to do the same with table creation, I always get warned that the table already exists, because it went ahead and tried to create my table and ignored the conditional statement. Just try running the following statement twice, you'll see what I mean:
IF NOT EXISTS (
SELECT 1
FROM sysobjects
WHERE name = 'a_table'
AND type = 'U'
)
CREATE TABLE a_table (
col1 int not null,
col2 int null
)
GO
Running the above produces the following error:
SQL Server Error on (localhost)
Error:2714 at Line:7 Message:There is
already an object named 'a_table' in
the database.
What's the deal with that?!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
到目前为止,我想出的唯一解决方法是使用立即执行:
工作起来就像一个魅力,感觉就像一个肮脏的黑客。
The only workaround I've come up with so far is to use execute immediate:
works like a charm, feels like a dirty hack.
除了在
execute("create table ...")
中调用create table
之外,没有其他方法,SYBASE 手册说:
There is no other way than calling
create table
inexecute("create table ...")
SYBASE Manual says:
我还没有对此进行测试,但您可以尝试将创建表语句移至存储过程中。 然后,您可以根据现有的 if 语句有条件地调用该存储过程。
I haven't tested this, but you could try moving the create table statement into a sproc. You could then conditionally call that sproc based on your existing if statement.
在 char @variable 中分配“CREATE TABLE”语句,然后执行 EXEC(@variable)。
Assign the "CREATE TABLE" statement in a char @variable and then do an EXEC(@variable).
如果您想始终创建表,但有条件地删除它,您可以使用:
If you want to always create the table, but conditionally drop it, you can use:
不需要任何解决方法;)
根据文档:
只需使用 IF NOT EXISTS。
There are no workarounds needed ;)
According to the documentation:
Just use the IF NOT EXISTS.
当使用 Sybase Anywhere 10.01 进行测试时,此方法有效:
This works when tested with Sybase anywhere 10.01 :
尝试使用开始和结束。
如果不存在(
选择计数(1)
来自系统对象
WHERE 名称 = 'a_table'
AND 类型 = 'U'
)
开始
创建表 a_table (
col1 int 不为空,
col2 int 空
)
END
去
Try using Begin and End.
IF NOT EXISTS (
SELECT Count(1)
FROM sysobjects
WHERE name = 'a_table'
AND type = 'U'
)
BEGIN
CREATE TABLE a_table (
col1 int not null,
col2 int null
)
END
GO