我有一个简单的表格,包含以下内容
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数据如果已经插入到表格中,我应该对查询做出哪些更改?
答案 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();