[MS-SQL]update na if - begin statement

Pagina: 1
Acties:

  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 08-04 12:54

Jaspertje

Max & Milo.. lief

Topicstarter
Allen,

Ik ben bezig met een SQL waarmee een structuur van de databae (SQL Server 2000) geupdate wordt. Dit moet over meerdere servers en moet dummy-proof zijn. Om het dummy proof te maken gebrui ik de Sys tables om te controleren of een tabel of kolom al bestaat. Normaal werkt dit prima behalve in dit geval:

SQL:
1
2
3
4
5
6
if (SELECT count(*) FROM SYSCOLUMNS WHERE ID = OBJECT_ID('test') AND Name = 'kolom1') > 0
begin
    Update test Set kolom2 = 'WaardeVankolom1'
    print 'Waarde in kolom1 veranderd'
    alter table kolom1 drop kolom1
end


ff pseudo code, het idee; Controleer of in tabel "test" een kolom is met de naam kolom1. Als dat zo is, dan moet er een update gedaan worden en daarna "kolom1" verwijderd.

De 1e keer dat alle code uitgevoerd moet worden, werkt het als een trein, maar zodra de code voor de 2e keer uitgevoerd word, kan "kolom1" niet gevonden worden (dat is logisch, die bestaat niet.

Doe ik nu het volgende:
SQL:
1
2
3
4
5
6
7
8
if (SELECT count(*) FROM SYSCOLUMNS WHERE ID = OBJECT_ID('test') AND Name = 'kolom1') > 0
begin
    --Update test Set kolom2 = 'WaardeVankolom1'
    print 'Waarde in kolom1 veranderd'
    alter table kolom1 drop kolom1
end
else
print 'De update is al een keer uitgvoerd'

waarbij de update uitgezet is en een else, dan krijg ik netjes te zien dat de update al een keer eerder gedaan is. Iemand enig idee waarom mijn update statement altijd uitgevoerd wil worden?

  • whoami
  • Registratie: December 2000
  • Laatst online: 29-04 13:16
Doe het eens zo:
code:
1
2
3
4
5
select @bliep = count(1) from syscolumns .....

if @bliep > 0
begin
end


of zo:
code:
1
if exists ( select count(1) from syscolumns ... )

[ Voor 26% gewijzigd door whoami op 04-10-2005 11:04 ]

https://fgheysels.github.io/


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 08-04 12:54

Jaspertje

Max & Milo.. lief

Topicstarter
whoami schreef op dinsdag 04 oktober 2005 @ 11:04:
Doe het eens zo:
code:
1
2
3
4
5
select @bliep = count(1) from syscolumns .....

if @bliep > 0
begin
end

of zo:
code:
1
if exists ( select count(1) from syscolumns ... )
Die gaan het allebei niet doen

  • whoami
  • Registratie: December 2000
  • Laatst online: 29-04 13:16
Jaspertje schreef op dinsdag 04 oktober 2005 @ 11:06:
[...]

Die gaan het allebei niet doen
Al geprobeerd ?
Of heb je een glazen bol ?

Heb je uberhaupt het SELECT statement al eens zo uitgevoerd in QA zodat je ziet wat het resultaat van die query is ?

[ Voor 92% gewijzigd door whoami op 04-10-2005 11:08 ]

https://fgheysels.github.io/


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 08-04 12:54

Jaspertje

Max & Milo.. lief

Topicstarter
whoami schreef op dinsdag 04 oktober 2005 @ 11:07:
[...]


Al geprobeerd ?
Of heb je een glazen bol ?

Heb je uberhaupt het SELECT statement al eens zo uitgevoerd in QA zodat je ziet wat het resultaat van die query is ?
Uiteraard heb ik ze allebei geprobeerd, mijn glazen bol is al een tijdje stuk :( En de Select geeft een 0 terug, waardoor de hele if niet uitgevoerd zou moeten worden. Dat is juist het probleem, want zet ik het update statement uit, dan gaat het wel goed (in de zin dat er dan niets meer gebeurt)

offtopic:
Had iets duidelijker neer moeten zetten dat ze het niet doen :)

[ Voor 7% gewijzigd door Jaspertje op 04-10-2005 11:12 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 29-04 13:16
Heb je dan wel die rij in je syscolumns tabel ? Heb je al eens alle records opgevraagd in syscolumns voor die tabel test ?

https://fgheysels.github.io/


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 08-04 12:54

Jaspertje

Max & Milo.. lief

Topicstarter
Nope, dat is het rare. De Count() geeft netjes een 0 terug en als ik een Select * from syscolumns doe dan krijg ik ook niets terug, maar otch wordt de update uitgevoerd. (Ik voer m trouwens uit in de Query Analyser)

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

whoami schreef op dinsdag 04 oktober 2005 @ 11:04:
of zo:
code:
1
if exists ( select count(1) from syscolumns ... )
Mijn glazen bol zegt me dat dit natuurlijk nooit gaat werken (tenminste niet zoals je het had bedoelt) ;)

Count zal altijd een resultaat geven. Je bedoelt natuurlijk iets als:
code:
1
if exists ( select * from syscolumns ... )

Today's subliminal thought is:


  • whoami
  • Registratie: December 2000
  • Laatst online: 29-04 13:16
Uh, ja natuurlijk. :P

https://fgheysels.github.io/


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 08-04 12:54

Jaspertje

Max & Milo.. lief

Topicstarter
Heb de oplossing gevonden, vandaar dat ik het toch een kick geef (met de oplossing uitteraard):

Het probleem is dat alle SQL eerst geparst wordt en niet meteen uitgevoerd, als een kolom of tabel dan niet gevonden wordt, dan zal de SQL al meteen gestopt worden. Dit kan op de volgende manier opgelost worden:

SQL:
1
2
3
4
5
6
if (SELECT count(*) FROM SYSCOLUMNS WHERE ID = OBJECT_ID('test') AND Name = 'kolom1') > 0 
begin 
    exec ('Update test Set kolom2 = 1 ')
    print 'Waarde in kolom1 veranderd' 
    alter table kolom1 drop kolom1 
end

Waarbij ik geen waardes heb gebruikt maar een ander SQL statement, dus doorde '' gaat het bij mij nog werken. Een ander punt is dat je idd wel beter Exist kan gebruiken ipv count, moet je idd geen count(*) laten staan.

De oplossing is dus Exec om je SQL heen
Pagina: 1