【发布时间】:2021-06-25 08:14:54
【问题描述】:
我有一个执行如下操作的存储过程:
MY_STORED_PROCEDURE:
IF NOT EXISTS(SELECT 1 FROM MY_TABLE WHERE MY_COLUMN1 = @MY_COLUMN1_VALUE_FROM_CODE AND MY_COLUMN2 = @MY_COLUMN2_VALUE_FROM_CODE)
BEGIN
--INSERT INTO MY_TABLE
这个存储过程是从 C# 代码中自动调用的。
现在,这意味着:
- 如果我们尝试为 COLUMN1 和 COLUMN2 组合插入一个带有 NEW VALUES 的条目,那么它应该被插入到 MY_TABLE 中。
与
- 如果我们尝试为 COLUMN1 和 COLUMN2 组合插入一个具有 EXISTING VALUES 的条目,则不应将其插入 MY_TABLE。
但是,发生的情况是插入一直在发生,与“IF NOT EXISTS”语句无关。
我已经直接从 SSMS 的查询构建器中检查了“IF NOT EXISTS”语句,该语句似乎没有任何问题。
有什么我没有考虑到的吗?这可能是什么错误?
这也是我调用我的 SP 的 C# 代码:
public void InsertIntoMyTable(List<SqlParameter> parameters, SqlConnection connection)
{
DataTable dt = new DataTable();
SqlCommand command = new SqlCommand("MY_STORED_PROCEDURE", connection)
{
CommandType = CommandType.StoredProcedure
};
if (parameters != null)
{
foreach (SqlParameter parameter in parameters)
{
command.Parameters.Add(parameter);
}
}
dt.Load(command.ExecuteReader());
}
注意:MY_STORED_PROCEDURE 是从不同的来源调用的。因此,也有可能同时从 1 个以上的源调用此过程。我不知道这是否会对我的问题产生一些影响。我正在报告它,以防万一。
谢谢!
【问题讨论】:
-
为什么不将您的条件放在
where子句中而不是if语句中?但是,如果它适用于 SSMS 而不是 C#,那么您将发送不同的值……就这么简单。您需要仔细检查您的 C# 代码和传入的值。实际上您应该在此处发布您的 C# 代码。 -
我添加了负责调用 MY_STORED_PROCEDURE 的 C# 代码
-
是的,如果您可以同时从不同的来源调用相同的过程,那么该行为当然可能是出乎意料的,因为您没有任何并发处理。
-
不,ExecuteReader 不会改变 SP 的运行方式。您需要发布参数的确切值和数据类型...因为问题必须就在那里 - 这是与 SSMS 唯一不同的地方。
-
同意@DaleK,你应该展示分配参数的真实代码,因为它们可能没有得到正确的类型或值。
标签: sql sql-server tsql stored-procedures transactions