无法在 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" 或类似的东西。
我最近开始使用 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" 或类似的东西。