Sql server SQL“WITH”在Spotfire中不起作用

Sql server SQL“WITH”在Spotfire中不起作用,sql-server,common-table-expression,spotfire,Sql Server,Common Table Expression,Spotfire,我尝试从MS SQL server运行Spotfire 7.8中的查询 对于简单的查询,一切都很好,但是我无法让常用的表表达式正常工作 这是一个非常简单的示例,在MS SQL Server Management studio中运行时不会出现问题: with test as ( select * from myTable) select * from test 在Spotfire中,我得到以下错误: 在外部数据源中执行查询时出错 外部错误: 关键字“with”附近的语法不正确。 关键字“wit

我尝试从MS SQL server运行Spotfire 7.8中的查询

对于简单的查询,一切都很好,但是我无法让常用的表表达式正常工作

这是一个非常简单的示例,在MS SQL Server Management studio中运行时不会出现问题:

with test as ( select * from myTable)
select * from test 
在Spotfire中,我得到以下错误:

在外部数据源中执行查询时出错

外部错误: 关键字“with”附近的语法不正确。 关键字“with”附近的语法不正确。如果此语句是 公共表表达式、xmlnamespaces子句或更改跟踪 在上下文子句中,前一个语句必须以 分号。 附近的语法不正确

我试着加上;正如所建议的那样,但这没有帮助:

在外部数据源中执行查询时出错

外部错误: “;”附近的语法不正确。 附近的语法不正确

我已经玩了一些添加;s在select语句结束后移动到不同的位置,关闭括号…,但无法使其工作

我真正的疑问是很长的,所以把所有的东西放在一起并摆脱CTE并不是一个真正的选择

为了澄清,我尝试了以下所有位置和组合,但都没有成功:

;with test as ( select * from myTable)
select * from test 

with test as ( select * from myTable;)
select * from test 

with test as ( select * from myTable);
select * from test 

TL;DR如果您拥有所有正确的权限,并且使用过Spotfire不止一次或两次,请创建一个存储过程,有关详细信息,请参见下文。如果没有,很抱歉,您将不得不将所有CTE放在一个非常长的查询中

所以我发现Spotfire实际上只会在标准信息链接或直接连接中运行一个查询

遗憾的是,这意味着它与临时表或CTE的关系不太好

如果将所有内容放在一起真的不是一个选项,那么您必须将其转换为一个存储过程,正如Sean在评论中提到的那样

唯一的缺点是,它需要比许多Spotfire用户更多的访问权限

首先,您需要在数据库中创建存储过程,或者与可以为您创建存储过程的人联系

其次,您需要使用信息设计器,这同样需要正确的权限。如果您有访问权限,信息设计器位于“工具”下。当您打开它时,您将在顶部有“创建信息”链接,在下面您将看到诸如“创建元素”之类的内容,其中包括过程

这是从数据源中选择存储过程的地方


然后,您需要创建一个信息链接Create Information Link,并选择刚刚构建的过程,该过程现在将位于Elements选项卡中

我建议从应用程序代码中提取sql。把它放到一个存储过程中,你就不必与应用程序和它们处理查询的有时非常奇怪的方式作斗争。我不知道如何在spotfire中调用一个以前从未听说过的过程,但是如果它可以执行查询,它就可以执行一个过程。我会看看谷歌,我怀疑有很多例子。Spotfire可以以各种创造性的方式破坏你的查询,破坏一切。您可以打开一个探查器,查看它实际发送给服务器的语句,了解它是如何失败的,以及如何解决这个问题,或者您也可以干脆放弃,不使用CTE。CTE仅在需要递归时才需要;如果不需要,任何使用CTE的查询都可以重写为使用子查询,而不是选择。。。从选择。。。我的观点是Spotfire正在将您的查询转换为其他内容,而其他内容包含语法错误。在跟踪它之前,你不知道它是做什么的,也不知道你是否能解决它。假设Spotfire正在按原样执行查询。我的论点是它不是。因此,您的SSMS测试意义不大。由于没有足够的信息来重现问题,因此投票决定关闭此测试。感谢您的建议,很遗憾,我无法创建存储过程,因此我将继续使用其他工具: