next:jdbc 如何允许 SQL 服务器有多个语句

next:jdbc How to allow multiple statements for SQL Server

我想 运行 对 SQL 服务器单次执行多个语句。我用 Node.js 做,但我不能 运行 使用 next.jdbc

相同的查询

例如,如果我 运行 这个:

(def db {:jdbcUrl "jdbc:jtds:sqlserver://localhost:1433/TESTDB;user=sa;password=passwd"})
(def ds (jdbc/get-datasource db))
(jdbc/execute! ds ["select * from EMPLOYEE;select FIRST_NAME from EMPLOYEE;"])

我也尝试过将语句包装在具有相同结果的事务中

(jdbc/execute! ds ["BEGIN TRANSACTION select * from EMPLOYEE;select FIRST_NAME from EMPLOYEE; COMMIT"])

我总是得到第一个查询。

我也尝试过 Microsoft 的 JDBC 驱动程序。 Sean Corfield 说如果数据库支持,那么 next.jdbc 应该支持。

但是我做不到


解决方案

正如肖恩·科菲尔德所指出的那样

(jdbc/execute! ds ["BEGIN select * from EMPLOYEE;select FIRST_NAME from EMPLOYEE; END"] {:multi-rs true})

据我所知,SQL服务器的JDBC驱动程序支持多语句。但是,即使这样做了,您也不应该使用它,因为它为注入式攻击打开了一个潜在的安全漏洞。相反,如果您确实需要执行多个 SQL 语句,请将当前的 SQL 重构为单个语句,或者使用包含在单个事务中的多个语句。

供参考,其他一些 JDBC 驱动程序,例如 MySQL,可能支持多语句。

是的,您可以 运行 返回多个语句和多个结果集,但您必须告诉 next.jdbc 这就是您想要的行为。

查看针对 MS SQL 服务器的测试 运行ning 多个语句:https://github.com/seancorfield/next-jdbc/blob/develop/test/next/jdbc_test.clj#L560-L572

入门指南中(简要地)提到了这一点:“如果将 :multi-rs true 选项传递给 execute!,您将得到一组结果集,而不仅仅是一个结果集合:零个或多个向量的向量。"