使用参数时在“ = @”或附近的语法错误

时间:2018-11-28 18:28:45

标签: dapper npgsql

我正在尝试将数据更新/插入到postgresql中,具体取决于表中是否已预先设置了给定的ID。

这适用于更新

UPDATE table SET 
   column=@Column
WHERE id=@Id;

这也适用(硬编码值)

DO 
$$
BEGIN
IF EXISTS (SELECT * FROM table WHERE id=123) THEN
 UPDATE table SET 
    column=123
 WHERE id=123;
ELSE
 INSERT INTO table(id,column) VALUES (123,123);
END IF;
END
$$

但是,当我尝试将值作为参数给出时,它就会中断,并在“ = @”处或附近出现错误语法错误

DO 
$$
BEGIN
IF EXISTS (SELECT * FROM table WHERE id=@Id) THEN
 UPDATE table SET 
    column=@Column
 WHERE id=@Id;
ELSE
 INSERT INTO table(id,column) VALUES (@Id,@Column);
END IF;
END
$$

为了找出问题,只留下一个这样的参数

DO 
$$
BEGIN
IF EXISTS (SELECT * FROM table WHERE id=@Id) THEN
 UPDATE table SET 
    column=123
 WHERE id=123;
ELSE
 INSERT INTO table(id,column) VALUES (123,123);
END IF;
END
$$

给出错误为 Npgsql.PostgresException:'42703:列“ id”不存在” 。那么,我有什么不可思议的参数吗?

1 个答案:

答案 0 :(得分:0)

Npgsql不支持用美元括起来的字符串文字($$)中的参数。

但是,您似乎正在实现upsert(更新或插入)-PostgreSQL本身就以INSERT ... ON CONFLICT语法支持它。请参阅this tutorial或有关此功能的其他文档,这应避免您尝试执行操作的复杂性。