Hej, Har du anget OUTPUT på anropet till din sp? Ja, det innebär att jag kan få svaret till en annan sp - men om jag vill ha svaret Jag är inte säker på att jag förstår vad du är ute efter men om du vill returnera KundId för nya kunder kan du göra såhär Om jag vill returnera kundId för nya kunder behöver jag inte hela den ovan angivna Kom på en fuling till...MsSQL 7.0/2000: utparameter i en sp från en sträng
Jag har skapat en stored procedure som jag använder för att söka fram ett företag.
Sökfunktionen fungerar utmärkt, problemet uppstår när jag vill fånga utparametern
i en annan procedur, då det framkom att min utparameter alltid returnerar noll
oavsett vad företagsindexet är. Nedan följer ett exempel på min kod. Hade varit tacksam
för förslag på lösningsförslag. Visar även de olika försök jag gjort:
<code>
CREATE PROCEDURE spFindForetag
-- ========
--proceduren lägger till Företag
--
(@namn VARCHAR(100) = '',
@orgnr VARCHAR(50) = '',
@gatuadress VARCHAR(50) = '',
@postnr VARCHAR(10) = '',
@postort VARCHAR(50) = '',
@telenr VARCHAR(50) = '',
@ansvarig NUMERIC(9) = 0,
@segment NUMERIC(9) = 0,
@kundid NUMERIC(9) = 0 OUTPUT )
AS
--Skapad 20030814 Emu
DECLARE @ErrorSave INT
DECLARE @villkor VARCHAR(1000)
--DECLARE @kundid NUMERIC(9)
SET @ErrorSave = 0
SET @villkor = ''
--SET @kundid = 0
--Stänger av radräknaren
--SET NOCOUNT ON
--kontrollerar vilka parametrar som har skickats in. De enda som måste vara identiskt korrekta är ansvarig och segment. På allt
--annat söker programmet på wildcard + tecken + wildcard
IF @namn > '' AND @namn IS NOT NULL
SET @villkor = 'namn LIKE ' + CHAR(39) + '%' + @namn + '%' + CHAR(39)
IF @gatuadress > '' AND @gatuadress IS NOT NULL
SET @villkor = @villkor + ' AND gatuadress LIKE ' + CHAR(39) + '%' + @gatuadress + '%' + CHAR(39)
IF @orgnr > '' AND @orgnr IS NOT NULL
SET @villkor = @villkor + ' AND orgnr LIKE ' + CHAR(39) + '%' + @orgnr + '%' + CHAR(39)
IF @postnr > '' AND @postnr IS NOT NULL
SET @villkor = @villkor + ' AND postnr LIKE ' + CHAR(39) + '%' + + @postnr + '%' + CHAR(39)
IF @postort > '' AND @postort IS NOT NULL
SET @villkor = @villkor + ' AND postort LIKE ' + CHAR(39) + '%' + @postort + '%' + CHAR(39)
IF @telenr > '' AND @telenr IS NOT NULL
SET @villkor = @villkor + ' AND telenr LIKE ' + CHAR(39) + '%' + @telenr + '%' + CHAR(39)
IF @ansvarig > 0 AND @ansvarig IS NOT NULL
SET @villkor = @villkor + ' AND ansvarig = ' + CAST(@ansvarig AS VARCHAR)
IF @segment > 0 AND @segment IS NOT NULL
SET @villkor = @villkor + ' AND segment = ' + CAST( @segment AS VARCHAR)
--ser till att villkoret blir rätt
IF left(@villkor,4) = ' AND'
SET @villkor = right(@villkor, len(@villkor) -4)
-----8<----------8<----------8<----------8<----------8<----------8<----------8<-----
Här det blir fel!!!
--och konkatenerar villkoret med söksträngen
SET @villkor ='SELECT uid FROM tblForetag WHERE ' + @villkor
--har även försökt med nedanstående istället för ovanstående rad:
--SET @villkor ='SELECT @kundid = uid FROM tblForetag WHERE ' + @villkor
--vilket ger felet att programmet påstår att @kundid inte är deklarerad (spelar ingen
--roll om jag deklarerat @kundid i huvudet eller som en lokal parameter.
--utför sökningen
print @villkor
EXECUTE (@villkor)
-- samt att jag har försökt
--EXECUTE @kundid = (@villkor)
--vilket inte ens går att kompilera
-----8<----------8<----------8<----------8<----------8<----------8<----------8<-----
--returnera @kundid
PRINT 'kundid: ' + cast(@kundid as varchar)
RETURN @kundid
IF @@ERROR <> 0
BEGIN
SET @ErrorSave = @@ERROR
RETURN @ErrorSave
END
--SET NOCOUNT OFF
</code>
MVH EmmaSv: MsSQL 7.0/2000: utparameter i en sp från en sträng
T.Ex:
EXEC spDoStuff @ValueIWant OUTPUT Sv: MsSQL 7.0/2000: utparameter i en sp från en sträng
till ett rs hur är det möjligt att göra då?
Har just nu löst det hela med en cursor - men det fungerar bara så länge anropet sker
från en annan sp - jag kommer ibland även ha behov av att ställa frågan direkt från
programmet.
/EmmaSv: MsSQL 7.0/2000: utparameter i en sp från en sträng
Alt. 1
Skapa en insert trigger på tabellen som gör
SELECT KundId FROM Inserted
Tabellen Inserted skapas automatiskt av SQL Server under själva inserten och kan innehålla flera poster. Detta kan orsaka en del negativa sidoeffekter i andra lägen så alternativ 2 nedan kanske är bättre.
Alt. 2
I slutet av din procedur så gör du RETURN @kundid skriv istället
SELECT KundID = @kundid. Detta kommer skapa ett resultatset men en post med ett fält med namnet KundIDSv: MsSQL 7.0/2000: utparameter i en sp från en sträng
proceduren... Den är till för att returnera id på den kund man angett i inparametrarna
oavsett vilka indata som ges.
Problemet har varit att eftersom jag konkatenerar villkoren efter hand i sp:n så kan
jag inte göra en enkel SELECT @kundid = uid FROM tblForetag [....] inte heller kan jag
tilldela @kundid i EXEC-satsen eftersom jag valt att exekvera en textsträng och därför
använder mig av () runt den sats som ska utföras.
När jag anropar sp:n från en annan procedur får jag ut @kundid precis som jag
förväntat mig. Anropar jag sp:n ifrån queryanalyzern med @utdata deklarerat och
avsett att ta emot utdatan så kommer den parametern fortfarande att vara NULL eller
'' beroende på om jag initierat den eller ej i QA-fönstret. Jag vill helt enkelt ha ett sätt
att få samma output i QA som jag får i anropande sp:s.
/EmmaSv: MsSQL 7.0/2000: utparameter i en sp från en sträng
CREATE TABLE #tmp (uid numeric(9))
INSERT INTO #tmp (uid)
EXECUTE (@villkor)
SELECT @kundid = uid FROM #tmp
/S@llad