2012-05-02 18 views
7

Estoy ejecutando la siguiente consulta en SSRS. Si agrego declaraciones para los dos parámetros, se ejecuta correctamente en SQL Management Console.Cómo enumerar los campos de la consulta SQL dinámica en el conjunto de datos SSRS

declare @EMRQuery varchar(max) 
declare @CPSQuery varchar(max) 

set @EMRQuery = 'select Person.ExternalId 
        from ml.Person 
         join ml.Obs on Person.pId = Obs.pId 
          join ml.ObsHead on Obs.hdId = ObsHead.hdId 
        where ObsHead.name = ''SCHOOLREGDTE'' 
         and Obs.xId = 1.e+035 
         and Obs.change = 2 
         and Obs.obsDate >= to_date(''' 
          + convert(varchar(30), @DateYearStart, 120) 
          + ''', ''YYYY-MM-DD HH24:MI:SS'') 
         and Obs.obsDate < to_date(''' 
          + convert(varchar(30), @DateQuarterEnd, 120) 
          + ''', ''YYYY-MM-DD HH24:MI:SS'')' 

set @CPSQuery = 'select ic.ListName, count(distinct pp.patientprofileid) as PatCount 
        from PatientProfile pp 
         left join PatientInsurance pi on pp.PatientProfileId = pi.PatientProfileId 
           and pi.OrderForClaims = 1 
           and pi.Inactive <> 1 
          left join InsuranceCarriers ic on pi.InsuranceCarriersId = ic.InsuranceCarriersId 
         join OpenQuery(EMR_LIVE 
          , ''' + replace(@EMRQuery, '''', '''''') + 
         ''') Students on pp.PatientId = Students.ExternalId 
        group by ic.ListName ' 

exec(@CPSQuery) 

Sin embargo, cuando lo conecto a esto en SSRS, no se registra que hay campos disponibles para informar sobre. ¿Cómo convenzo a SSRS de que tengo campos para trabajar? Gracias.

Editar: Acabo de declarar los parámetros en la consulta, y reconoció los nombres de los campos.

declare @DateYearStart datetime 
declare @DateQuarterEnd datetime 
set @DateYearStart = '2011-07-01' 
set @DateQuarterEnd = '2012-03-31' 

Por supuesto, que con error porque yo estaba declarando los parámetros dos veces, una vez como parámetros de consulta y una vez dentro de la consulta. Pero, tan pronto como comenté las líneas de arriba, perdí los campos nuevamente.

Respuesta

4

Alguien más en los foros de MSDN sugirió selecciono en una tabla temporal, por lo que sustituyó a la sentencia exec final con

declare @CarrierList table (Listname varchar(200), PatCount int); 
insert @CarrierList exec(@CPSQuery) 
select * from @CarrierList 

y parece estar funcionando bien ahora.

1

Probablemente hay algo malo con su consulta. Los conjuntos de datos de SSRS pueden evaluar cualquier cosa que pongas en ellos. Por ejemplo, yo acabo de encontrar una pequeña prueba con estas 2 preguntas:

declare @a varchar(500) 
declare @b varchar(500) 
set @a = '(select name from sys.tables) B' 
set @b = 'select B.name as name2 from '[email protected] 
exec(@b) 

y mi conjunto datase reconocía el nombre 2 campo.

Te aconsejo que revises tu consulta.

Si realmente no funciona, puede intentar agregar su código a un procedimiento de SQL Server que devuelve una tabla con nombres de campos predefinidos.

+0

Como dije, cuando declare los parámetros y los valores proporcionados para ellos, la consulta funcionó bien. Fue cuando pasé los parámetros en el conjunto de datos del informe que no vería los campos. Pero, cuando agregué campos calculados al conjunto de datos, pude ver que devolvía la cantidad correcta de registros, aunque no pude convencerlo de que me mostrara los campos que quería ver. – SarekOfVulcan

+0

Veo ahora. Sí, realmente no genera los campos. ¿Intentó la idea del procedimiento almacenado? – Diego

+0

Aún no. Puede que tenga que buscar una solución, pero este informe va en contra de una aplicación de terceros, y trato de meterme con las definiciones de datos lo menos posible. (Aprendí esa lección cuando una vista materializada de Oracle que había construido se salió de control y comenzó a reconstruirse cada vez que se actualizaron los datos, en lugar de a las 2:00 a.m. todas las noches ...) – SarekOfVulcan

0

Sospecho que esto se debe a que su código tiene dos consultas, aunque solo se debe ejecutar una. Por lo tanto, sugiero combinar las dos consultas en una sola consulta.

+0

No es posible, desafortunadamente, lo hará observe que la primera consulta está obteniendo parámetros, y OPEN_QUERY no permite parámetros.Expandir todo es la única forma de hacerlo. – SarekOfVulcan

+0

@SarekOfVulcan: puedo ver por qué necesitaría usar SQL dinámico en lugar de vincular los valores de los parámetros directamente a la consulta. Sin embargo, debe poder declarar toda la consulta (incluida la subconsulta unida en OpenQuery) en una sola instrucción SET. (¡Por supuesto, esto puede no resolver el problema de todos modos!) –

+0

Ah, entiendo tu punto. Sospecho que no ayudaría, pero lo intentaré más tarde. – SarekOfVulcan

1

Dado que SSRS ejecuta el procedimiento almacenado con SET FMTONLY ON; al hacer clic en el botón Actualizar. Luego coloque un SET FMTONLY OFF; como la primera línea en su procedimiento almacenado y devolverá sus campos.

+1

FMTONLY ha quedado en desuso. – Mitch

1

¿Cómo convencer a SSRS de que tiene campos para trabajar? Respuesta: agregue manualmente los campos al conjunto de datos de Propiedades del conjunto de datos ... Campos. Esto hará feliz al diseñador y mientras existan los campos cuando se ejecute la consulta, el informe funcionará. Al menos funcionó para mí usando una consulta OLE DB a DB2 con texto de consulta dinámico.

Cuestiones relacionadas