2016-05-18 8 views
0

最近、Java \ SQL Serverアプリケーションで非常に簡単なレポートを作成するためにBIRTを使用し始めました。今私は動的なSQLのstmt私はBIRTのデータセットで使用しようとしている(私の英語私は "Frenshです)problemeは、BIRTはデータセットを作成することはできません、私はこのレポートSQLエラー#1、私はまた、私たちのデータセットを作成するためにbirtのSQL変数を使用できるかどうかを知りたい場合 これは私のSQLクエリです:BIRTでSQL Serverクエリを実行できません

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 ('[email protected]+')) PVT ' 
EXEC(@sqlCommand) 

答えて

0

まさにそれが動的である、ので、私の知る限りが関係することができますよう、BIRTは、一般的にあなたの動的なクエリから任意のメタデータを取得することはできませんので、それは基本的に、実行時に変更することができます。回避策はありますが、あなたの問題がありますあなたのdynsqlでピボット関数を使用すると、可変量のカラムが得られます。

これはクエリでは機能しません.BIRTでは、データセットの列、名前、型が正確に必要です。

代わりにピボットをBIRTに移動し、データセットで正確なメタデータを返すようにします。 BIRTはピボットを使用できます。

ただし、結果セットが一貫していることを確認する限り、動的SQLを使用できます。まず、動的SQLをSQL Server上のストアドプロシージャにパックし、パラメータを渡します。このように、たとえば、あなたの結果セットを定義2012+ SQL Serverの場合

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

では、SQL Server 2012のを所有していない場合はBIRTは、データセットのメタデータを認識するために

、あなたは選択肢を持っています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"などを追加することもできます。

関連する問題