如果不存在 SQL 语句
Posted
技术标签:
【中文标题】如果不存在 SQL 语句【英文标题】:IF NOT EXISTS SQL Statement 【发布时间】:2014-07-31 22:48:51 【问题描述】:我对 SQL 还很陌生。我正在尝试编写一个存储过程来检查“别名”是否在表中,如果是则返回详细信息;如果它不存在,它将添加它。目前我已经完成了 50% 的工作,但如果它确实存在,它不会返回别名详细信息
DECLARE @Alias VARCHAR(MAX)
IF NOT EXISTS(SELECT * FROM [Users] where [Alias] = @Alias)
INSERT INTO [Users] ([Alias], [Country], [Role])
VALUES (@Alias, 'UK', 'User')
谁能告诉我哪里出错了?
提前致谢
汤姆
【问题讨论】:
应该返回这个值的代码在哪里? 您缺少条件的else
部分,您必须返回详细信息
您能更好地解释发生了什么问题吗?
它没有返回值。我猜马丁已经说过 - 我还没有写那部分代码。通过放置“ELSE SELECT * FROM [Users] Where [Alias]=@Alias”对我的问题进行排序?
你真的只想在它不存在的情况下返回它吗?还是应该返回该行?此外,您可能应该对此设置唯一约束,否则这不是线程安全的,您可能会被骗。
【参考方案1】:
您似乎希望别名是唯一的 - 为什么不简单地创建这样的约束:
create unique index users_alias on users(alias);
或者,如果您确实必须通过查询来完成,请使用 select-into:
INSERT INTO [Users] ([Alias], [Country], [Role])
SELECT @Alias, 'UK', 'User'
FROM (SELECT 1) DUAL
WHERE NOT EXISTS(SELECT * FROM [Users] where [Alias] = @Alias)
如果还没有具有别名的用户,则查询的 SELECT 部分返回 1 行,否则没有行。
需要考虑的事项:您不需要存储过程来执行此操作。 需要考虑的其他事项:您可能根本不需要存储过程。 需要进一步考虑:存储过程实际上可能是 bad idea
【讨论】:
这并没有回答关于返回行的问题。 这是更大的 VBA 代码的一部分,与权限设置有关。它不会创建 Alias,但会存储用户的 windows 环境登录信息,以便以后可以从 Outlook 通讯簿中查找用户详细信息。正如我所说 - 我是 SQL 新手,如果这是一种更好且更合适的方法,那么请说以上是关于如果不存在 SQL 语句的主要内容,如果未能解决你的问题,请参考以下文章