Vraag


  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Topicstarter
Ik probeer mijn diep weggezonken SQL-kennis weer wat bij te spijkeren. Daarom heb ik een scriptje gebouwd voor SQL Server 2019 + SSMS 19.1 wat onderhoud op databases kan doen.
Nu doet dat script niet wat ik wil en ik snap niet waar het aan ligt. Ongetwijfeld dat ik op de verkeerde termen Google.

Ik heb het probleem geïsoleerd door alles wat irrelevant is uit het script te halen. Dan blijft dit over.

Eerst een werkende variant van dat script. De database NietHierDb wordt niet gevonden en de code in het BEGIN-END block wordt ook niet uitgevoerd. Zoals ik verwacht.

code:
1
2
3
4
IF EXISTS ( SELECT * FROM [sys].[master_files] WHERE [name] = 'NietHierDb' )
BEGIN
    PRINT 'NietHierDb is gevonden'
END

En dan een tweede versie met een USE statement in het BEGIN-END block. Het script geeft nu een error op het USE-statement ondanks dat er niet wordt voldaan aan de voorwaarde in het IF-block en het BEGIN-END blok dus helemaal niet uitgevoerd mag worden.

code:
1
2
3
4
5
IF EXISTS ( SELECT * FROM [sys].[master_files] WHERE [name] = 'NietHierDb' )
BEGIN
    USE [NietHierDb]
    PRINT 'NietHierDb is gevonden'
END

Beste antwoord (via downtime op 07-09-2023 16:16)


  • GarBaGe
  • Registratie: December 1999
  • Laatst online: 12-09 16:23
T-SQL is geen programmeertaal / programmacode.
De betekenis van de statements zijn daarmee niet vergelijkbaar met een programmeertaal.

USE is een statement om aan te geven dat je een bepaalde DB wilt gaan gebruiken (bepaalt de context).
Je hebt grote kans dat de executie engine van T-SQL eerst alle USE statements uitvoert om ervoor te zorgen dat alle databases beschikbaar zijn,

Ik denk dat je USE meer moet zien als een globale definitie en niet een conditionele conditie.

Ryzen9 5900X; 16GB DDR4-3200 ; RTX-4080S ; 7TB SSD

Alle reacties


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • GarBaGe
  • Registratie: December 1999
  • Laatst online: 12-09 16:23
T-SQL is geen programmeertaal / programmacode.
De betekenis van de statements zijn daarmee niet vergelijkbaar met een programmeertaal.

USE is een statement om aan te geven dat je een bepaalde DB wilt gaan gebruiken (bepaalt de context).
Je hebt grote kans dat de executie engine van T-SQL eerst alle USE statements uitvoert om ervoor te zorgen dat alle databases beschikbaar zijn,

Ik denk dat je USE meer moet zien als een globale definitie en niet een conditionele conditie.

Ryzen9 5900X; 16GB DDR4-3200 ; RTX-4080S ; 7TB SSD


  • n00bCoder
  • Registratie: Mei 2011
  • Laatst online: 12-09 15:56
Of je hele query in een string stoppen en executen met exec(sql) in je if block.

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Topicstarter
Ik zie het. Als ik het script uitvoer, en die database bestaat niet, dan springt ie meteen naar dat USE statement en geeft een error. Alle code die ervoor staat wordt gewoon genegeerd en dus ook het IF-statement.

Een workaround lijkt dit te zijn. Maar het voelt wel alsof ik het paard achter de wagen span:

code:
1
2
3
4
5
IF EXISTS ( SELECT * FROM [sys].[master_files] WHERE [name] = 'NietHierDb' )
BEGIN
    EXEC sp_executesql N'USE [NietHierDb]'
    PRINT 'NietHierDb is gevonden'
END

Hier kan ik mijn script wel weer mee fixen. Bedankt.