проблема SQL-запросов при составлении отчетов - PullRequest
1 голос
/ 29 июня 2011

У меня есть этот sql-запрос, что он все работает нормально, но я хочу проанализировать 'where part', используя параметр (@ged), когда я пытаюсь это сделать в sql, он работает нормально ... но я не могу заставить его работатьCrystal Report или служба отчетов sql в этом запросе. @ J_Sec - это параметр, а @ged - остальная часть, где statment

CREATE proc [dbo].[con]
@J_Sec as nvarchar(255),
@ged as varchar(max) 
as
declare @sql as varchar(max)

set @sql='
select 
(case when c.Age_18_24=1 then ''18-24'' when c.Age_25_29=1 then ''25-29'' when c.Age_30_39=1 then ''30-39'' 
 when c.Age_40_Above=1 then ''40-above'' else null  end)AS "Age",c.status 

from consumer c 
inner join dbo.Journey j on c.JOURNEY_SEQUENCE=j.JOURNEY_SEQUENCE
inner join Teams t on j.Team_id=t.Team_id where c.journey_sequence= '+@J_Sec+' and '+@ged;

exec(@sql)
go

Ответы [ 2 ]

0 голосов
/ 29 июня 2011

Вы можете обнаружить, что Crystal Reports обнюхивает SP для своей выходной подписи. Поскольку у него его нет (так как он скрыт внутри строки @sql), Crystal ничего не показывает.

Это, однако, предположение, так как я не использовал Crystal много лет. Вы можете проверить это, связавшись с этим SP и проверив, получите ли вы какие-либо результаты ...

CREATE PROCEDURE [dbo].[test] @mode AS INT
AS

DECLARE
  @sql AS VARCHAR(MAX)

IF (@mode = 1)
  SET @sql = 'SELECT ''This is mode one'' AS message'
ELSE
  SET @sql = 'SELECT ''You may only specify mode one'' AS error'

EXEC(@sql)

GO

Если вы ничего не получаете от этого, у вас, похоже, нет иного выбора, кроме как реорганизовать свой дизайн более традиционным способом; Обрабатывать SP так же, как если бы вы работали с методом в объекте - входная подпись, принимающая значения, а не код, и имеющая фиксированную выходную подпись.

0 голосов
/ 29 июня 2011

Если ваш параметр @ged равен тому, что говорится в вашем комментарии, то почему бы не отказаться от строкового подхода sql и использовать:

EDIT для дополнительных параметров

CREATE proc [dbo].[con]
@J_Sec as nvarchar(255),
@male int,
@age_18_24 int,
@student int,
@main_lmg int,
@main_Price int,
@alt_lmg int,
@alt_price int,
@source_ka INT

as

select 
    (case 
        when c.Age_18_24=1 then '18-24' 
        when c.Age_25_29=1 then '25-29'
        when c.Age_30_39=1 then '30-39' 
        when c.Age_40_Above=1 then '40-above' 
        else null  
    end)
    AS "Age"
    , c.status 

from consumer c 
    inner join dbo.Journey j on c.JOURNEY_SEQUENCE = j.JOURNEY_SEQUENCE
    inner join Teams t on j.Team_id = t.Team_id 

where 
    c.journey_sequence= @J_Sec 
    and male != @male 
    and Age_18_24 != @age_18_24 
    and Student != @student 
    and Main_LMG != @main_lmg 
    and Main_Price != @main_Price 
    and ALT_LMG != @alt_lmg
    and ALT_Price != @alt_price 
    and Source_Ka != @source_ka

go

В качестве альтернативы вы можете попробовать использовать exec sp_executesql .

...