【发布时间】:2019-10-07 05:34:18
【问题描述】:
我正在使用 dapper 将数据通过 c# 传递到 sql 存储过程。
c#(使用 dapper):
var dt = new DataTable("dbo.TVPtype");
dt.SetTypeName("dbo.TVPtype");
dt.Columns.Add("ID", typeof(int));
dt.Rows.Add(5);
_db.Execute("mysp", param: new { TVP = dt.AsTableValuedParameter("dbo.TVPtype"), commandType: CommandType.StoredProcedure);
下面的 SQL 查询将不起作用,我不知道为什么!它会从 mytable 中删除所有数据。 SQL 存储过程:
CREATE PROCEDURE [dbo].[mysp] @TVP dbo.TVPtype READONLY AS
DELETE FROM [dbo].[mytable] WHERE NOT EXISTS
(
SELECT NULL FROM @TVP na
WHERE ID = na.ID
)
为了解决这个问题,我在存储过程中使用了一个临时表,如下所示,它运行良好。 我使用临时表的解决方案:
CREATE table temptb (ID int)
insert into temptb select * from @TVP
现在我在删除查询中使用 temptb 而不是 @TVP:
DELETE FROM [dbo].[mytable] WHERE NOT EXISTS
(
SELECT NULL FROM temptb na
WHERE ID = na.ID
)
它运作良好并删除特定数据(不是所有数据)! 那么我的第一个查询有什么问题?
【问题讨论】:
-
首先,找出问题出在 c# 还是 SQL - 尝试直接从 SSMS 运行第一个存储过程,看看会发生什么。
标签: c# sql stored-procedures table-valued-parameters