好的,我正在尝试改进我的asp数据输入页面,以确保进入我的数据表的条目是唯一的。
在这个表中,我有SoftwareName和SoftwareType。我正在尝试获取它,这样如果入口页面发送一个插入查询,其中的参数与表中的参数匹配(因此标题和类型相同),则会抛出一个错误,并且不会输入数据。
大概是这样的:
INSERT INTO tblSoftwareTitles(
SoftwareName,
SoftwareSystemType)
VALUES(@SoftwareName,@SoftwareType)
WHERE NOT EXISTS (SELECT SoftwareName
FROM tblSoftwareTitles
WHERE Softwarename = @SoftwareName
AND SoftwareType = @Softwaretype)
因此,这种语法非常适合从一个表中选择列到另一个表中,而不需要输入重复的列,但似乎不想使用参数化插入查询。有人能帮我解决这个问题吗?
编辑:
下面是我在ASP插入方法中使用的代码
private void ExecuteInsert(string name, string type)
{
//Creates a new connection using the HWM string
using (SqlConnection HWM = new SqlConnection(GetConnectionStringHWM()))
{
//Creates a sql string with parameters
string sql = " INSERT INTO tblSoftwareTitles( "
+ " SoftwareName, "
+ " SoftwareSystemType) "
+ " SELECT "
+ " @SoftwareName, "
+ " @SoftwareType "
+ " WHERE NOT EXISTS "
+ " ( SELECT 1 "
+ " FROM tblSoftwareTitles "
+ " WHERE Softwarename = @SoftwareName "
+ " AND SoftwareSystemType = @Softwaretype); ";
//Opens the connection
HWM.Open();
try
{
//Creates a Sql command
using (SqlCommand addSoftware = new SqlCommand{
CommandType = CommandType.Text,
Connection = HWM,
CommandTimeout = 300,
CommandText = sql})
{
//adds parameters to the Sql command
addSoftware.Parameters.Add("@SoftwareName", SqlDbType.NVarChar, 200).Value = name;
addSoftware.Parameters.Add("@SoftwareType", SqlDbType.Int).Value = type;
//Executes the Sql
addSoftware.ExecuteNonQuery();
}
Alert.Show("Software title saved!");
}
catch (System.Data.SqlClient.SqlException ex)
{
string msg = "Insert Error:";
msg += ex.Message;
throw new Exception(msg);
}
}
}
6条答案
按热度按时间ghhkc1vu1#
您可以使用
IF
陈述式来执行此作业:您可以在没有
IF
的情况下使用SELECT
来执行此操作这两种方法都容易受到race condition的影响,因此,虽然我仍然使用上述方法之一进行插入,但您可以使用唯一约束来保护重复插入:
SQL-Fiddle示例
附录
在SQL Server 2008或更高版本中,可以将
MERGE
与HOLDLOCK
一起使用,以消除出现争用条件的可能性(争用条件仍然不能替代唯一约束)。SQL Fiddle上的合并示例
y4ekin9u2#
IF NOT EXISTS(...) INSERT
方法 是 不 安全 的 。 您 必须 先 执行Session #1
, 然后 再 执行Session #2
。 在 执行v #2
之后 , 您 将 看到 , 如果 没有UNIQUE
索引 , 您 可能 会 得到 重复 的 对(SoftwareName,SoftwareSystemType)
。 会话 #1 的 延迟 用于 为 您 提供 足够 的 时间 来 执行 第 二 个 脚本( 会话 #2 ) 。 您 可以 减少 此 延迟 。中 的 每 一 个
格式
结果 :
格式
gev0vcfq3#
有一个很好的解决这个问题,你可以使用Sql的合并关键字
您可以在执行以下操作之前检查此操作,以下是示例
2guxujil4#
更多的是一个建议进一步阅读的评论链接...一个非常好的博客文章,它对完成这项任务的各种方法进行了基准测试can be found here。
他们使用以下几种技术:“在不存在的地方插入”、“合并”语句、“插入Except”和您典型的“左联接”,看看哪种方式完成此任务最快。
用于每种技术的示例代码如下(直接从其页面复制/粘贴):
对于那些追求速度的人来说,这是一本好书!在SQL 2014中,Insert-Except方法被证明是处理5000万条或更多记录的最快方法。
j13ufse25#
我知道这篇文章是旧的,但我发现了一个原始的方法,插入值到一个表与关键字INSERT INTO和EXISTS。
我说原创是因为我没有在网上找到它。
这就是:
bzzcjhmw6#
忽略重复的唯一约束不是解决方案吗?