带有“IF NOT EXISTS”的原始 SQL 不会执行

Posted

技术标签:

【中文标题】带有“IF NOT EXISTS”的原始 SQL 不会执行【英文标题】:Raw SQL with "IF NOT EXISTS" doesn't execute 【发布时间】:2013-10-10 22:43:22 【问题描述】:

这是我的 Python 代码。似乎如果原始 SQL 包含IF NOT EXISTS,sqlalchemy 将不会执行它。也没有抛出异常。

db.execute(text(
    """
    IF NOT EXISTS ( select 1 from agent_assignment where exception_id = :exception_id )
    BEGIN
        insert into agent_assignment(exception_id, [user], work_status, insert_date, insert_user)
        values (:exception_id, :user, 'pending', :date, :insert_update_user)
    END
    ELSE
        update agent_assignment
        set 
            [user] = :user,
            update_date = :date,
            update_user = :insert_update_user
        where exception_id =  :exception_id
    """),
    exception_id = exception_id, 
    user = assignee,
    date = datetime.now(),
    insert_update_user = insert_update_user
)

如果我删除IF..ELSE 部分,SQL 将正确执行。所以我想从技术上讲,不可能以IF..ELSEEXISTS 作为语句的一部分来执行原始SQL?

运行原始 SQL 的正确方法是什么?

提前致谢。

【问题讨论】:

你不需要在被替换的参数值周围加上单引号,比如':user'而不是:user吗?这是在某种 try/catch 块中吗?通常当查询没有执行时,是有原因的。 @AaronBertrand 实际上会添加引号。我已经对此进行了测试。谢谢。 shrug 您需要调试代码并确保任何可能被吞下/忽略的错误和/或在 SQL Server 中运行跟踪以查看实际的 SQL 查询是什么发送。您是否考虑过将参数传递给存储过程,而不是在您的应用程序代码中构建这个即席 SQL? 【参考方案1】:

我需要在脚本末尾添加COMMIt,因为查询有点复杂,而且不知何故 sqlalchemy 无法自动提交。

【讨论】:

您也可以在每个语句的基础上使用自动提交,例如text("我的字符串").execution_options(autocommit=True),见text()和execution_options()。

以上是关于带有“IF NOT EXISTS”的原始 SQL 不会执行的主要内容,如果未能解决你的问题,请参考以下文章

SQL 语句“CREATE EXTENSION[*] IF NOT EXISTS UUID_OSSP”中的语法错误

sql的语句提示有语法错误,求大神 create database if not exists `fwzl`;

oracle insert if not exists 语句

为啥这个 IF NOT EXISTS 语句不起作用?

如何判断 CREATE TABLE IF NOT EXISTS 是不是创建了表? [复制]

使用 IF NOT EXISTS 生成插入脚本