无法在 BIRT 中执行 sql 服务器查询

Can't execute sql server query in BIRT

我最近开始使用 BIRT 在 Java\SQL 服务器应用程序中进行一些非常简单的报告。现在我有一个动态的 sql stmt,我正试图在 BIRT 的数据集中使用它(对不起我的英语我是法语)问题是 BIRT 无法创建数据集,我没有找到此报告的解决方案。Birt 告诉我 sql 服务器没有 return sql 语句没有 return ResultSet 对象。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)

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

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

而是将枢轴转移到 BIRT 并使您的数据集 return 成为精确的元数据。 BIRT 能够使用数据透视表。

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

要让 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 添加为您的数据集源,保留元数据并最终更改您的 SP将 FMTONLY 设置为关闭。 FMTLONLY ON 将 return 只有元数据到 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

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