我有这个SQL查询,它一切正常,但我想使用参数解析'where part'(@ged) 当我在sql中尝试这个工作正常..但我不能让它在水晶报告或SQL报告服务中工作 在此查询中.. @ J_Sec是一个参数,@ged是where 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
答案 0 :(得分:0)
如果您的@ged参数等于您在评论中所说的内容,那么为什么不放弃sql字符串方法并使用:
编辑以获取额外参数
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。
答案 1 :(得分:0)
您可能会发现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 - 输入签名采用值,而不是代码,并具有固定的输出签名。