sql – INSERT VALUES WHERE NOT EXISTS

前端之家收集整理的这篇文章主要介绍了sql – INSERT VALUES WHERE NOT EXISTS前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
好的,所以我试图改进我的asp数据输入页面,以确保进入我的数据表的条目是唯一的.

所以在这个表中我有SoftwareName和SoftwareType.我试图得到它,如果条目页面发送插入查询与参数匹配表中的什么(所以相同的标题和类型),然后一个错误被抛出并且没有输入数据.

这样的事情

  1. INSERT INTO tblSoftwareTitles(
  2. SoftwareName,SoftwareSystemType)
  3. VALUES(@SoftwareName,@SoftwareType)
  4. WHERE NOT EXISTS (SELECT SoftwareName
  5. FROM tblSoftwareTitles
  6. WHERE Softwarename = @SoftwareName
  7. AND SoftwareType = @Softwaretype)

所以这个语法非常适合将列从一个表中选择到另一个表中,而不会输入重复项,但似乎不希望使用参数化的插入查询.有人可以帮我吗?

干杯丹

编辑:

这是我在我的asp插入方法中使用的代码

  1. private void ExecuteInsert(string name,string type)
  2. {
  3. //Creates a new connection using the HWM string
  4. using (sqlConnection HWM = new sqlConnection(GetConnectionStringHWM()))
  5. {
  6. //Creates a sql string with parameters
  7. string sql = " INSERT INTO tblSoftwareTitles( "
  8. + " SoftwareName,"
  9. + " SoftwareSystemType) "
  10. + " SELECT "
  11. + " @SoftwareName,"
  12. + " @SoftwareType "
  13. + " WHERE NOT EXISTS "
  14. + " ( SELECT 1 "
  15. + " FROM tblSoftwareTitles "
  16. + " WHERE Softwarename = @SoftwareName "
  17. + " AND SoftwareSystemType = @Softwaretype); ";
  18.  
  19. //Opens the connection
  20. HWM.Open();
  21. try
  22. {
  23. //Creates a sql command
  24. using (sqlCommand addSoftware = new sqlCommand{
  25. CommandType = CommandType.Text,Connection = HWM,CommandTimeout = 300,CommandText = sql})
  26. {
  27. //adds parameters to the sql command
  28. addSoftware.Parameters.Add("@SoftwareName",sqlDbType.NVarChar,200).Value = name;
  29. addSoftware.Parameters.Add("@SoftwareType",sqlDbType.Int).Value = type;
  30. //Executes the sql
  31. addSoftware.ExecuteNonQuery();
  32. }
  33. Alert.Show("Software title saved!");
  34. }
  35. catch (System.Data.sqlClient.sqlException ex)
  36. {
  37. string msg = "Insert Error:";
  38. msg += ex.Message;
  39. throw new Exception(msg);
  40. }
  41.  
  42. }
  43. }

解决方法

我会这样做和IF语句:
  1. IF NOT EXISTS
  2. ( SELECT 1
  3. FROM tblSoftwareTitles
  4. WHERE Softwarename = @SoftwareName
  5. AND SoftwareSystemType = @Softwaretype
  6. )
  7. BEGIN
  8. INSERT tblSoftwareTitles (SoftwareName,SoftwareSystemType)
  9. VALUES (@SoftwareName,@SoftwareType)
  10. END;

您可以在不使用SELECT的情况下执行此操作

  1. INSERT tblSoftwareTitles (SoftwareName,SoftwareSystemType)
  2. SELECT @SoftwareName,@SoftwareType
  3. WHERE NOT EXISTS
  4. ( SELECT 1
  5. FROM tblSoftwareTitles
  6. WHERE Softwarename = @SoftwareName
  7. AND SoftwareSystemType = @Softwaretype
  8. );

这两种方法都易于使用race condition,所以当我仍然使用上述方法之一插入时,但是您可以使用唯一的约束来保护重复的插入:

  1. CREATE UNIQUE NONCLUSTERED INDEX UQ_tblSoftwareTitles_Softwarename_SoftwareSystemType
  2. ON tblSoftwareTitles (SoftwareName,SoftwareSystemType);

Example on SQL-Fiddle

附录

sql Server 2008或更高版本中,您可以使用MERGE与HOLDLOCK来消除竞争条件的机会(这仍然不能替代唯一约束).

  1. MERGE tblSoftwareTitles WITH (HOLDLOCK) AS t
  2. USING (VALUES (@SoftwareName,@SoftwareType)) AS s (SoftwareName,SoftwareSystemType)
  3. ON s.Softwarename = t.SoftwareName
  4. AND s.SoftwareSystemType = t.SoftwareSystemType
  5. WHEN NOT MATCHED BY TARGET THEN
  6. INSERT (SoftwareName,SoftwareSystemType)
  7. VALUES (s.SoftwareName,s.SoftwareSystemType);

Example of Merge on SQL Fiddle

猜你在找的MsSQL相关文章