webForumDet fria alternativet

SP: exec wheresats

2 svar · 280 visningar · startad av Vide

VideMedlem sedan dec. 19996 094 inlägg
#1

Hejsan,

Jag har två SP:s, den ena anropar den andra. Tanken är att den första skall få en wheresats som skall användas i den andra SP:n.

SP1:

CREATE PROCEDURE [dbo].[getAggregateLineValue]
@intDiagramID int,
@intLineID int
AS
declare @WhereStatement as varchar
exec @WhereStatement = getAggregateLineWhereStatement @intDiagramID, @intLineID
exec('select count(*) from p5714_data2 where ' + @WhereStatement )

SP2:

CREATE PROCEDURE [dbo].[getAggregateLineWhereStatement]
@intDiagramID int,
@intLineID int
AS
select sqlexpression from p5714_aggregate_diagram_v where diagramid=@intDiagramID and lineid=@intLineID

Detta fungerar inte då den tycker att @WhereStatement är 0 när den skall användas.

Vad gör jag för fel?

Mvh, Vide

LarsGMedlem sedan dec. 200012 465 inlägg
#2
declare @WhereStatement as varchar

Om du inte anger någon längd så är default 1.

exec @WhereStatement = getAggregateLineWhereStatement

innebär att du tilldelar returvärdet från proceduren, eftersom du inte har någon return så blir det 0. Du kan inte få värdet av en select i en procedur till en variabel i en annan procedur. Skriv en funktion i stället

create function X(...)
returns varchar(...)
return (select ... )

och i den andra proceduren

set @WhereStatement = dbo.x(...)
VideMedlem sedan dec. 19996 094 inlägg
#3

Tackar det fungerade fint!

Nästa problem blir att jag vill ha en kontroll på att funktionen verkligen hittade något, om inte så skall den returnera -1:

create function dbo.getAggregateLineWhereStatement( @intDiagramID int, @intLineID int )
returns varchar(250)
begin
if exists ( select sqlexpression from p5714_aggregate_diagram_v where diagramid=@intDiagramID and lineid=@intLineID )
return( select sqlexpression from p5714_aggregate_diagram_v where diagramid=@intDiagramID and lineid=@intLineID )
else
return( '-1' )

Detta ger fel på sista raden att "incorrect syntax near ')'"

Mvh, Vide

Genererad på 500 ms · cache AV · v20260730165559-full.f96bc7eb