SQL输出插入的新数据的id,如果没有插入则重复输出id

时间:2014-07-02 12:55:28

标签: sql sql-server

我有一个简单的表格,包含以下内容

TABLE Color(
    Color_id int IDENTITY(1,1) NOT NULL PRIMARY KEY,
    Coloring_type [varchar](20) NULL,
    ColorA int NOT NULL,
    ColorB int NULL,
    ColorC int NULL)

我想执行以下查询来插入一些数据并返回Inserted Color_id以在C#中执行一些操作

INSERT INTO Color OUTPUT INSERTED.Color_id
VALUES ('solid' ,'red' ,'green' ,'blue')

无论如何,实际上,这样的插入可能会在再次插入相同的值时使数据重复,所以我想做一个查询,如果是新的则插入数据并输出插入的id或输出相同的id数据如果已经插入到表格中,我应该对查询做出哪些更改?

4 个答案:

答案 0 :(得分:2)

您可以事先检查是否存在带有EXISTS检查的记录,然后根据结果执行代码。

你可以用两种方式输出id,输出参数或最简单的方法是简单的SELECT,在C#中你可以调用.ExecuteScalar来返回单个值:

IF EXISTS (SELECT 1  
           FROM Color 
           WHERE Coloring_type = 'solid' AND ColorA = 'red' AND
                 ColorB = 'green' AND ColorC = 'blue')
    BEGIN
        -- IT EXISTS UPDATE CODE GOES HERE

        -- GET ID
        SELECT ID
           FROM Color 
           WHERE Coloring_type = 'solid' AND ColorA = 'red' AND
                 ColorB = 'green' AND ColorC = 'blue'
    END
ELSE
    BEGIN
        -- IT DOES NOT EXIST SO INSERT CODE GOES HERE

        -- GET ID USING @@IDENTITY TO GET LAST INSERTED ID
        SELECT @@IDENTITY
    END

如果在存储过程中执行此操作,则会将值作为参数取用,并将颜色值替换为@params

WHERE Coloring_type = @Color_type AND ColorA = @ColorA AND
      ColorB = @ColorB AND ColorC = @ColorC

答案 1 :(得分:2)

除非您使用MERGE(),否则我认为您无法在一个声明中执行此操作。但是你可以实现逻辑。

首先,您需要定义副本。让我猜你想要所有四列都是唯一的:

create unique index idx_color(ColoringType, ColorA, ColorB, ColorC);

这将强制执行该条件。然后,您可以使用异常处理来获得所需内容:

begin try
    INSERT INTO Color(ColoringType, ColorA, ColorB, ColorC)
        OUTPUT INSERTED.Color_id
        VALUES ('solid' ,'red' ,'green' ,'blue')
end try
begin catch
    select @AlreadyInsertedId = Color_id
    from Color
    where ColoringType = 'solid' and colorA = 'red' and colorB = 'green' and colorC = 'blue'
end catch;

顺便说一句,最好始终列出要插入insert语句中的列。

答案 2 :(得分:2)

您可以尝试使用以下内容

IF EXISTS (SELECT Color_id  
           FROM Color 
           WHERE Coloring_type = 'solid' AND ColorA = 'red' AND
                 ColorB = 'green' AND ColorC = 'blue')
    BEGIN
        SELECT Color_id  
        FROM Color 
        WHERE Coloring_type = 'solid' AND ColorA = 'red' AND
              ColorB = 'green' AND ColorC = 'blue'
    END
ELSE
    BEGIN
        INSERT INTO Color OUTPUT INSERTED.Color_id
        VALUES ('solid' ,'red' ,'green' ,'blue')

        SELECT SCOPE_IDENTITY() --THIL WILL RETURN THE NEWLY ADDED Color_id
    END

答案 3 :(得分:1)

如果将列设置为primary key,则不允许重复值。所以,真正的问题是如何获取并检查错误。您可以在C#中使用try和catch,并使用SqlException e捕获错误,如下所示:

catch (SqlException e)
{
   switch (e.Number)
   {
      case 2601:
         // Do something.
         break;
      default:
         throw;
   }
 }

如果您想查看其他错误编号,请转到此site ..

如果没有错误,则插入您的数据,然后您可以使用以下代码获取最后插入的行:

INSERT INTO table_name(col1,col2)
OUTPUT INSERTED.Color_id
VALUES(@col1, @col2);

然后将值传递给C#变量:

 Int32 newId = (Int32) myCommand.ExecuteScalar();