【问题标题】:Can't execute sql server query in BIRT无法在 BIRT 中执行 sql server 查询
【发布时间】:2016-05-18 09:05:23
【问题描述】:

我最近开始使用 BIRT 在 Java\SQL Server 应用程序中进行一些非常简单的报告。现在我有一个动态 sql stmt,我正试图在 BIRT 上的 DataSet 中使用(对不起我的英语我是 Frensh)问题是 BIRT 无法创建数据集,我没有找到此报告的解决方案. birt告诉我sql server does not return sql statement does not return a ResultSet object. SQL错误#1,我也想知道我们是否可以在birt中使用sql变量来创建我们的数据集 这是我的 sql 查询:

DECLARE @ListeAffaires TABLE(Nom_APPEL nvarchar(MAX)) 

INSERT INTO @ListeAffaires(Nom_APPEL)

SELECT DISTINCT AF_NOMAPPEL 
FROM F_AFFAIRES  INNER JOIN T_P_SOCIETE ON AF_CODE_SOCIETE = SOC_CODE
WHERE SOC_CODE = 'RUS01'

declare @AffairesChaine NVARCHAR(MAX)
SET @AffairesChaine = STUFF(
( SELECT distinct ',ISNULL(' + QUOTENAME(AF_NOMAPPEL) + ', ''0'') ' + QUOTENAME(AF_NOMAPPEL)
FROM F_AFFAIRES  INNER JOIN T_P_SOCIETE ON AF_CODE_SOCIETE = SOC_CODE
INNER JOIN VUE_VALORISATION_TEMPS_PASSES ON VTPS_CODE_AFFAIRE = AF_CODE_AFFAIRE
WHERE SOC_CODE = 'RUS01' AND   VTPS_date_FICHE >= '02/11/2015'
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'),1,1,'')



DECLARE @AffairesChaines NVARCHAR(MAX)
SET @AffairesChaines = ''
SELECT @AffairesChaines = @AffairesChaines +'['+ Nom_APPEL + '],' FROM @ListeAffaires 
SET @AffairesChaines = LEFT (@AffairesChaines, LEN(@AffairesChaines) - 1)

DECLARE @sqlCommand varchar(MAX)
SET @sqlCommand  = 'DECLARE @SYNTHESETEMPS TABLE (  VTPS_CODE_COLLAB varchar(250)
, VTPS_NOM_COLLAB varchar(250)
, VTPS_PRENOM_COLLAB varchar(250)
, TSRV_LIBELLE varchar(250)
, VTPS_COL_ALPHANUM01 varchar(10)
, AF_NOMAPPEL NVARCHAR(MAX)
, VTPS_DUREE float(24)
)

INSERT INTO @SYNTHESETEMPS (
 VTPS_CODE_COLLAB
, VTPS_NOM_COLLAB
, VTPS_PRENOM_COLLAB
, TSRV_LIBELLE
, VTPS_COL_ALPHANUM01
, AF_NOMAPPEL
, VTPS_DUREE
)
SELECT VTPS_CODE_COLLAB
, VTPS_NOM_COLLAB
, VTPS_PRENOM_COLLAB
, TSRV_LIBELLE
, VTPS_COL_ALPHANUM01
, AF_NOMAPPEL
, VTPS_DUREE
FROM VUE_VALORISATION_TEMPS_PASSES
    INNER JOIN F_P_COLLABORATEUR ON VTPS_CODE_COLLAB = CLB_CODE 
    INNER JOIN F_AFFAIRES ON VTPS_CODE_AFFAIRE = AF_CODE_AFFAIRE 
    INNER JOIN T_COL_SERVICE ON CLB_TSRV_IDENT = TSRV_IDENT 
    INNER JOIN T_P_SOCIETE ON AF_CODE_SOCIETE = SOC_CODE
WHERE SOC_CODE = ''RUS01'' AND   VTPS_date_FICHE >= ''02/11/2015''

SELECT  VTPS_NOM_COLLAB +'' '' + VTPS_PRENOM_COLLAB AS "Remaining hours"
, TSRV_LIBELLE AS "Service"
, VTPS_COL_ALPHANUM01 AS "Categories"
,'+ @AffairesChaine +'
FROM @SYNTHESETEMPS 
PIVOT (SUM(VTPS_DUREE)
FOR 
AF_NOMAPPEL IN ('+@AffairesChaines+')) PVT '  
EXEC(@sqlCommand)

【问题讨论】:

    标签: sql sql-server eclipse birt


    【解决方案1】:

    据我所知,BIRT 通常无法从您的动态查询中获取任何元数据,因为它确实是动态的,因此它基本上可以在运行时更改。有一些解决方法,但您的问题是您在 dynsql 中使用了数据透视函数,导致列数可变。

    这不适用于您的查询,BIRT 需要您数据集中的确切数量的列、名称和类型。

    而是将支点转移到 BIRT 并让您的数据集返回准确的元数据。 BIRT 可以使用枢轴。

    但是,您可以使用动态 sql,只要您确保结果集是一致的。首先将你的动态sql打包成sql server上的存储过程,只传参数。

    要让 BIRT 识别数据集元数据,您有以下选择:

    对于 SQL Server 2012+,请定义您的结果集,例如:

    EXEC(@sqlCommand)
    WITH RESULT SETS
    (
      (
        RemainingHours INT,
        Service NVARCHAR(255),
        VTPS_COL_ALPHANUM01 NVARCHAR(255),
        AF_NOMAPPEL NVARCHAR(255)
      )
    );
    

    如果您没有 SQL Server 2012 及更高版本,请在您的 StoredProc 中打开SET FMTLONLY ON,将 SP 添加为您的数据集源,保留元数据,最后使用 SET FMTONLY OFF 更改您的 SP。 FMTLONLY ON 只会将元数据返回给 BIRT。

    如果上述方法不起作用,请尝试使用简单的虚拟语句来更改您的 StoredProcedure。示例:

    SELECT CAST(0 as INT) as RemainingHours,
        CAST('test' as NVARCHAR(255)) as Service,
        CAST('test' as NVARCHAR(255)) as VTPS_COL_ALPHANUM01,
        CAST('test' as NVARCHAR(255)) as AF_NOMAPPEL
    

    创建您的数据集,获取元数据,然后使用您的动态 sql 更改您的 SP。为此,您还可以添加某种调试参数“ReturnMetadataOnly”或类似的东西。

    【讨论】:

      猜你喜欢
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      相关资源
      最近更新 更多