要从多个表中插入检查的SQL Server存储过程

时间:2014-02-04 05:32:46

标签: sql sql-server sql-server-2008 stored-procedures

我有2张桌子

表1

userid int
username varchar(25)
password varchar(25)
siteid int (foreign key)

表2

siteid int
siteurl varchar(200)

我想使用存储过程触发插入

我将用户名,密码和siteurl作为参数。

现在,当我想插入数据时,我需要检查条件

  • 每个siteurl不允许重复的用户名
  • 如果用户名存在且网站网址也匹配则不应允许插入
  • 如果用户名存在,但不同的siteurl则允许插入

目前我正在获取第一个站点ID,然后将站点ID作为参数传递,但这意味着站点和数据库之间的流量将加倍。

但是如果单个存储过程发生同样的情况,则会有差异

1 个答案:

答案 0 :(得分:1)

你在找这样的东西吗?

CREATE PROCEDURE addnewuser 
  @username VARCHAR(25),
  @password VARCHAR(25),
  @siteurl  VARCHAR(200)
AS
SET NOCOUNT ON;
IF NOT EXISTS(SELECT * 
                FROM userlogin u JOIN sites s 
                  ON u.siteid = s.siteid 
               WHERE u.username = @username
                 AND s.siteurl = @siteurl)
BEGIN
  INSERT INTO sites (siteurl) 
    VALUES (@siteurl);
  INSERT INTO userlogin (username, password, siteid) 
    VALUES (@username, @password, SCOPE_IDENTITY());
END
ELSE
  RAISERROR ('User already exists', 16, 1);
GO

这是 SQLFiddle 演示。 取消评论上一次EXEC,然后点击Build Schema以查看它不会让您再次插入同一用户