我使用一个C#程序将CSV数据传输到数据库中。我正在使用下面的SQL字符串,以确保不将双变量输入数据库。
"INSERT INTO Transacties (DebetRekening, CreditRekening, Datum, Bedrag, VolgNummer, Munt, Code, Betalingskenmerk, Omschrijving)
SELECT
@DebetRekening, @CreditRekening, @Datum, @Bedrag, @VolgNummer,
@Munt, @Code, @Betalingskenmerk, @Omschrijving
WHERE NOT EXISTS (SELECT TOP 1(TransactieID)
FROM Transacties
WHERE DebetRekening LIKE @DebetRekening
AND CreditRekening LIKE @CreditRekening
AND Datum LIKE @Datum
AND Bedrag LIKE @Bedrag
AND VolgNummer LIKE @VolgNummer
AND Munt LIKE @Munt
AND Code LIKE @Code
AND Betalingskenmerk LIKE @Betalingskenmerk
AND Omschrijving LIKE @Omschrijving)"在这里添加了换行以使其可读性,它是程序中的一行。
这里我包括一条记录,除非我能在数据库中找到这条记录。
即使当我知道我试图输入的记录在数据库中时,SQL仍然找不到它,只输入一个double。
如果我省略了如下所有和声明:
"INSERT INTO Transacties
(DebetRekening, CreditRekening, Datum, Bedrag, VolgNummer, Munt, Code, Betalingskenmerk, Omschrijving)
SELECT @DebetRekening, @CreditRekening, @Datum, @Bedrag, @VolgNummer, @Munt, @Code, @Betalingskenmerk, @Omschrijving
WHERE NOT EXISTS
(
SELECT TOP 1(TransactieID)
FROM Transacties
WHERE
DebetRekening LIKE @DebetRekening
)"它找到现有的记录,并且不会双倍地输入它。
不管我使用的是哪个参数,只要只有一个参数。一旦我输入一个和检查另一个字段,它就找不到任何记录了。
我在这里错过了什么?
发布于 2020-01-12 21:17:29
问题可能在于NULL值。如果任何一个值都是Datum LIKE @Datum,则像NULL这样的条件不会得到满足。
您需要检查这两个值是相等的还是都是null:这是空安全相等的概念(例如,SQLServer没有内置这个概念,不像MySQL )。
INSERT INTO Transacties(...)
SELECT ...
WHERE NOT EXISTS
(
SELECT 1
FROM Transacties
WHERE
(DebetRekening IS NULL AND @DebetRekening IS NULL OR DebetRekening = @DebetRekening)
AND (CreditRekening IS NUL AND @CreditRekening IS NULL OR CreditRekening = @CreditRekening)
AND ...
)备注:
EXISTS子查询中不需要SELECT TOP 1;EXISTS构造是用来检查是否存在某种东西的,并且数据库基本上会立即丢弃结果。conventiona LIKE b是一个广泛使用的accordinglya = b (因为右操作数没有使用通配符):我简化了数据库上的代码accordinglyON DUPLICATE KEYS,Postgres有ON DUPLICATE KEYShttps://stackoverflow.com/questions/59708143
复制相似问题