Avatar billede repsak Nybegynder
18. juli 2006 - 20:46 Der er 13 kommentarer og
1 løsning

RETURN i executesql

Hej, hvorfor printer denne procedure BÅDE 'a' og 'b'? Og hvordan får jeg den til at forlade proceduren når jeg skriver RETURN?

:-/

CREATE PROCEDURE [dbo].[p_Test] 

    @Comment VARCHAR(255) 

AS 
DECLARE @sql nvarchar(1000);

SET @sql='IF NOT EXISTS(select 1 from sysobjects where 1=0) 
BEGIN 
    RETURN
END '
print 'a'
EXEC sp_executesql @sql;
print 'b'
Avatar billede arne_v Ekspert
18. juli 2006 - 21:14 #1
den RETURN'er vel fint

fra sp_executesql altsaa ...

:-)

jeg tror at du enten skal bruge raiseerror eller saette og teste paa en
retur vaerdi
Avatar billede repsak Nybegynder
18. juli 2006 - 22:06 #2
ikke forstået?
Jeg er ikke interesseret i at raiserror, men at slippe for efterfølgende kode - som er udenfor executesql - bliver udført.

Kan du uddybe din idé?
Avatar billede arne_v Ekspert
19. juli 2006 - 02:12 #3
jeg kan ikke få det til at virke med retur værdi

følgende raiseerror hack virker:

CREATE PROCEDURE usp_test
AS
DECLARE @sql NVARCHAR(1000)
DECLARE @retval INTEGER
SET @sql='IF EXISTS (SELECT * FROM t1)
BEGIN
    RAISERROR(''not so'',16,1)
END'
PRINT 'a'
EXEC sp_executesql @sql
IF @@ERROR = 0
BEGIN
    PRINT 'b'
END
GO
Avatar billede repsak Nybegynder
19. juli 2006 - 08:28 #4
Hmm jeg er ikke helt glad for at den kaster en fejl. Min helt konkrete problemstilling er at jeg skal teste for om en tabel eksisterer på en linked server. På nogle miljøer eksisterer den linkede server ikke (hvilket er helt ok).

Jeg er interesseret i at min procedure skal skrive nogle data til den linkede server HVIS den eksisterer - ellers skal proceduren bare returnere uden af ham som kalder får besked om det er gået godt eller skidt.

Problemer er at hvis jeg skriver
IF NOT EXISTS(select 1 from LOADTEST.master.dbo.sysobjects where id = object_id(N''[dbo].[load_test_TEMP]'') and OBJECTPROPERTY(id, N''IsUserTable'')=1) 
så kommer fortolkeren med en fejl der gør at jeg slet ikke må oprette en procedure med ovenstående linje - hvis den linkede server ikke er sat ok.

Derfor ville jeg benytte dynamisk sql, men det giver tilsyneladende også problemer. Nogle idéer?
Avatar billede arne_v Ekspert
20. juli 2006 - 02:23 #5
hvad med

IF EXISTS (SELECT * FROM sysservers WHERE srvname = 'LOADTEST')

?
Avatar billede repsak Nybegynder
20. juli 2006 - 08:48 #6
Det virker også fint, men den kan jeg ikke bruge til at teste på tabeller.
Avatar billede arne_v Ekspert
20. juli 2006 - 13:49 #7
men kan du ikke have en nestet if, hvor du først tester på server og så tester på tabel ?

jeg tænker kun højt
Avatar billede repsak Nybegynder
21. juli 2006 - 10:11 #8
Hvis du kan et 'test-statement' hvor HELT stien (inkl. linked server) står som en streng så kan man. Ellers vil den hele tiden lave compile-time check på  om den linkede server er eksisterer. Dette gælder også for executesql
Avatar billede arne_v Ekspert
22. juli 2006 - 04:36 #9
2000 eller 2005 ?
Avatar billede repsak Nybegynder
23. juli 2006 - 01:29 #10
det er er 2000
Avatar billede arne_v Ekspert
23. juli 2006 - 01:46 #11
kan du flytte logikken op i applikationen ?
Avatar billede repsak Nybegynder
23. juli 2006 - 19:50 #12
nej desværre, for det skal bruges til benchmarking/logging på sql niveau.
Avatar billede arne_v Ekspert
23. juli 2006 - 19:56 #13
så er jeg vist løbet tør for gode ideer
Avatar billede repsak Nybegynder
30. juli 2006 - 12:22 #14
okay... jeg lukker her :(
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester