[MSSQL] Stored Procedure vraagje

Pagina: 1
Acties:

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Ik ben bezig met een stored procedure, waarvan ik gegevens wil hebben uit meerdere DB's. Nu wil ik (o.a.) aan die stored procedure meegeven WELKE DB 'ie moet gebruiken (we hebben meerdere DB's met dezelfde info, begin nou niet over "waarom").

Ik zit in de DB Reparaties, en wil ook info uit de DB 'WinNAWTB2002'

Dit is mijn (test)stored procedure:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
CREATE PROCEDURE [sp_ListOpenstaand]
    @dbName as Varchar(100) = 'WinNawtb2002'
AS

DECLARE @strSQL as varchar(1000)

Set @strSQL = 'select * from tbl_Reparaties' + 
        ' inner join ' + @dbName + '.dbo.tbl_Klanten on rep_kl_id = kl_id' +
        ' where rep_akkoord = 0'

Exec @strSQL
GO


Alleen komt 'ie dan terug met de melding:
code:
1
2
3
4
Server: Msg 911, Level 16, State 1, Line 11
Could not locate entry in sysdatabases for database
'select * from tbl_Reparaties inner join WinNawtb2002'.
No entry found with that name. Make sure that the name is entered correctly.


Als ik @strSQL print, en die Copy&Paste in mijn SQL Query analyzer dan werkt 'ie WEL, evenals als ik de naam er "hard" in zet:
code:
1
2
3
4
5
6
7
CREATE PROCEDURE [sp_ListOpenstaand]
AS

select * from tbl_Reparaties
inner join WinNAWTB2002.dbo.tbl_Klanten on rep_kl_id = kl_id
where rep_akkoord = 0
GO


Het gaat me nu dus effe PUUR om het principe. Ik zit niet te wachten op replies als "gebruik geen * maar noem alle velden" e.d.

Iemand enig idee waarom Exec dit niet vreet?

[ Voor 15% gewijzigd door RobIII op 27-05-2003 12:31 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

gebruik geen * maar noem alle velden!

Sorry, kon het niet laten :+

ff serieus, twee databases gebruiken gaat niet door simpelweg een SELECT erop los te laten. Gebruik het USE statement wanneer je een tweede db wilt gebruiken en nog een om je eerste weer te gebruiken. Als je dan data van de ene en de andere db wilt joinen, zul je een temporary table moeten gebruiken (dus iets als SELECT * INTO #temp FROM tabelletje WHERE blabla)

日本!🎌


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
_Thanatos_ schreef op 27 May 2003 @ 12:35:
gebruik geen * maar noem alle velden!

Sorry, kon het niet laten :+

ff serieus, twee databases gebruiken gaat niet door simpelweg een SELECT erop los te laten. Gebruik het USE statement wanneer je een tweede db wilt gebruiken en nog een om je eerste weer te gebruiken. Als je dan data van de ene en de andere db wilt joinen, zul je een temporary table moeten gebruiken (dus iets als SELECT * INTO #temp FROM tabelletje WHERE blabla)
Le-zen:
RobIII schreef op 27 May 2003 @ 12:27:
Als ik @strSQL print, en die Copy&Paste in mijn SQL Query analyzer dan werkt 'ie WEL
Dat kan en werkt dus wel degelijk... Kwestie van de DB naam ervoor gooien:
code:
1
2
3
select * from tbl_Reparaties
inner join WinNAWTB2002.dbo.tbl_Klanten on rep_kl_id = kl_id
where rep_akkoord = 0

Werkt dus gewoon als de SP in de DB "Reparaties" zit en de rest van de info in de DB "WinNAWTB2002".

Het probleem is dat "EXEC[ute]" de "dynamisch gebouwde" query niet wil uitvoeren.

[ Voor 27% gewijzigd door RobIII op 27-05-2003 12:43 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Plaats de variabele tussen ronde haakjes in de Exec aanroep:
code:
1
2
3
4
5
6
7
8
9
10
11
12
CREATE PROCEDURE [sp_ListOpenstaand]
    @dbName as Varchar(100) = 'WinNawtb2002'
AS

DECLARE @strSQL as varchar(1000)

Set @strSQL = 'select * from tbl_Reparaties' + 
        ' inner join ' + @dbName + '.dbo.tbl_Klanten on rep_kl_id = kl_id' +
        ' where rep_akkoord = 0'

Exec (@strSQL)
GO

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Die ronde haakjes zullen afaik niet uitmaken.

Vreemd dat het niet werkt idd.

Probeer het misschien eens met een simpelere query, bv een zonder join. Werkt dat:
code:
1
2
SET @strSQL = 'SELECT * FROM ' + @dbName + '.TableName';
EXEC @strSQL;

https://fgheysels.github.io/


Verwijderd

whoami schreef op 27 May 2003 @ 13:11:
Die ronde haakjes zullen afaik niet uitmaken.
Die ronde haakjes maken net wel het verschil. Lees de syntax maar eens na:
http://msdn.microsoft.com...tsqlref/ts_ea-ez_05ro.asp

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Verwijderd schreef op 27 May 2003 @ 13:05:
Plaats de variabele tussen ronde haakjes in de Exec aanroep:
code:
1
...<knip>...
Ik dacht in eerste instantie hetzelfde als whoami, maar <damn> je hebt gelijk makker! Het werkt! Toppie!

Thanx, * RobIII kan nu weer verder _/-\o_

[ Voor 36% gewijzigd door RobIII op 27-05-2003 13:33 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1