我正在通过Servicestack.ORMLite执行一条SQL语句。该语句具有以下格式:
with rowdata as ( select t1.v1, t1.v2 datakey, t2.v1 datavalue from t1 left join t2 on t2.rowid = t1.rowid ) select * from rowdata PIVOT ( SUM(datavalue) FOR datakey IN ([1],[2],[3],[4],[5]) )AS PivtTable
这可以在SQL Server和Oracle中正确执行(有一些小的更改)。但是,当使用“ db.Select(sql)”命令通过Servicestack.ORMLite执行时,出现以下错误:
关键字“ with”附近的语法不正确。如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则前一条语句必须以分号终止。
以分号终止只会返回以下错误:
’;’附近的语法不正确
执行所有其他“选择”语句都可以,但是如果它以“ with”或其他任何形式开头,则无法正常工作。但这似乎不是Servicestack.ORMLite错误- 两者都是System.Data.SqlClient.SqlExceptions。如果我将在调试中生成的生成的代码复制到SQL Server Management Studio中,则可以正常工作,但是通过ORMLite执行相同的代码却失败了。
有任何想法吗?
Servicestack.ORMLite不喜欢CTE。您应该查看使用自定义SQL API的方法,请参见此处
像这样的东西:
var sql = @"with rowdata as ( select t1.v1, t1.v2 datakey, t2.v1 datavalue from t1 left join t2 on t2.rowid = t1.rowid ) select * from rowdata PIVOT ( SUM(datavalue) FOR datakey IN ([1],[2],[3],[4],[5]) )AS PivtTable" List<MyType> results = db.SqlList<MyType>(sql);