Hej, nu har jag nästa fråga om SQL Server om hur den fungerar. Vi har idag ett antal databaser ute och <b>Lägg till en else-händelse så bör det funka.</b> IF exists(select sc.role ...) Du har inte kollat att fältet <b>Du har inte kollat att fältet MinKolumn_2 finns</b> Du har rätt i att du måste använda EXECUTE, alternativt sp_executesql förstås. När proceduren parsas så kontrolleras att kolumnen finns, vare sig just den raden körs eller ej i slutänden. Tack för svaren. Min undran var egentligen om det gick att lösa på ett annat sätt än executemetoden eller undertrycka det felmeddelande som uppstår. Jag markerar denna som löst nu.Kolumn som inte finns...
inte alla stämmer överens med hur de bör se ut, det är ett pågående jobba att rätta till det men tillsvidare
får vi dras med att vissa databaser inte har alla kolumner (eller har för många!!!). Att söka ut om en kolumn
finns i en databas är ingra problem utan problemet uppstår i IF-satserna som skall köras. Jag tycker att
<code>
IF exists(select sc.* from sysobjects so, syscolumns sc
where so.[name] = 'MinTabell'
and so.[id] = sc.[id]
and sc.[name] = 'MinKolumn')
BEGIN
UPDATE MinTabell
SET MinKolumn_2 = 1
WHERE MinKolumn = 1 or MinKolumn = 3
END
</code>
borde fungera iom att det bara blir sant i de fall som kolumnen finns, men SQL server sparkar bakut direkt på de
databser som inte har MinKolumn i MinTabell och ger felmeddelandet
"Server: Msg 207, Level 16, State 3, Line 1 Invalid column name 'MinKolumn'." vilket iofs är helt korrekt. Men borde det
inte gå att göra ett generellt skript som kan köras på alla varianter av databsen? Jag vet att
<code>
IF exists(select sc.* from sysobjects so, syscolumns sc
where so.[name] = 'MinTabell'
and so.[id] = sc.[id]
and sc.[name] = 'MinKolumn')
BEGIN
execute( N' UPDATE MinTabell
SET MinKolumn_2 = 1
WHERE MinKolumn = 1 or MinKolumn = 3')
END
</code>
fungerar, men helst vill jag slippa att ha execute i skriptet. Samma problem gäller tex "select MinKolumn from MinTabell". Jag tror iofs inte att det finns en annan lösning än att köra execute men vill gärna veta om någon har något uppslag (tex om man kan slå av prekompileringen och optimeringen som görs för en del av skript).Sv:Kolumn som inte finns...
Hur menar du att det skall få bort felmeddelandet som blir på update-satsen? Det är ju inte if-satsen i sig som det blir fel på utan på update (eller "select minkolumn from mintabbell") när MinKolumn inte finns? Men jag var tvungen att testa och det fungerar inte att bara lägga till en "else" sats. Sv: Kolumn som inte finns...
blablabla
kör update
Else
Gör något annat.Sv: Kolumn som inte finns...
MinKolumn_2
finns som du försöker ändra värde på.
Du kollar endast efter fältet
MinKolumnSv:Kolumn som inte finns...
Oki, jag kanske är extremt otydlig med vad jag vill. MinKolumn_2 finns alltid i alla databser däremot innehåller bara en del databser kolumnen MinKolumn. Jag antar att när servern försöker optimera sql-satserna innan de körs så smäller den på update (kan lika gärna vara "select MinKolumn from MinTabell") iom att inte MinKolumn finns. Att satsen inte körs på databser som saknar MinKolumn tas ju omhand av IF-satsen så den kommer överhuvudtaget aldrig att köras på dem, däremot kommer ju servern att försöka optimera de sqlsatser som finns innan den körs och då visar den fel på updatesatsen (eller tex "select MinKolumn from MinTabell").
Att den visar fel kan jag faktiskt förstå men vad jag är ute efter är att veta om det går att undanta vissa delar av sqlkoden från optimering, pre-kompliering mm, går att fånga felmeddelandet och gömma det från dem som kör det eller på något annat sätt undvika felmeddelandet UTAN att använda Execute metoden.
Hans Sjödins förslag trodde jag inte på men var ändå tvungen att testa. Kan inte förstå hur en else
sats skulle påverka det som sker.
Skälet till att jag vill dölja felmeddelandet är att de rackarns DBA-erna i Frankrike, Schweiz mm blir så nervösa när det ploppar upp ett meddelande som säger "Server: Msg 207, Level 16, State 3, Line 1 Invalid column name 'MinKolumn'." och då ringer dem supporten eller ännu värre mig... ;-)
Även om felmedelandet syns hos dem som saknar kolumen så körs hela scriptet. Ett sätt att undvika felmedelandet har jag visat på ovan, men finns det mer eller bättre sätt?Sv: Kolumn som inte finns...
Sv:Kolumn som inte finns...