Autor Téma: IF NOT EXIST  (Přečteno 4889 krát)

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
IF NOT EXIST
« kdy: 01-08-2012, 02:43:06 »
Zdravim,

rad bych do jedne DB vytvoril sloupecek, ale pouze, pokud neexistuje, zkousim to takto:

Kód: MySQL [Vybrat]
  1. IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'testovaci' AND COLUMN_NAME = 'gpsx')
  2.   ALTER TABLE testovaci
  3.     ADD gpsx BIT DEFAULT NULL
  4.  

bohuzel to skonci s chybou:
Msg 4902, Level 16, State 1, Line 3
Cannot find the object "testovaci" because it does not exist or you do not have permissions.

fakt nevim co s tim...

A jeste jeden dotaz, co je to: StoredProcedures????

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 568
  • Karma: 23
Re:IF NOT EXIST
« Odpověď #1 kdy: 01-08-2012, 09:41:34 »

bohuzel to skonci s chybou:
Msg 4902, Level 16, State 1, Line 3
Cannot find the object "testovaci" because it does not exist or you do not have permissions.

fakt nevim co s tim...

chtělo by to rozlišovat mezi typy uvozovek - ' je pro stringy, ` je pro názvy db objektů. " některé db berou pro názvy objektů podobně jako Parodie `

stored procedure je něco jako procedura v normálních prg. jazycích - prostě část kódu, která se dá volat odjinud

Offline Fala

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: XE2
    • Software pro poskytování technické podpory
Re:IF NOT EXIST
« Odpověď #2 kdy: 01-08-2012, 10:22:35 »
možná může být problém v prefixu tabulky. zkus tam napsat 'dbo.testovaci'

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Re:IF NOT EXIST
« Odpověď #3 kdy: 01-08-2012, 12:28:59 »
Ne, at udelam, obe moznosti, ktere jste mi zde nastinili, tak ani jedna neni funkcni...

Kód: MySQL [Vybrat]
  1. IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'testovaci' AND COLUMN_NAME = 'gpsx')
  2.   ALTER TABLE dbo.testovaci
  3.     ADD gpsx BIT DEFAULT NULL
  4.  

Kód: MySQL [Vybrat]
  1. IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'testovaci' AND COLUMN_NAME = 'gpsx')
  2.   ALTER TABLE 'dbo.testovaci'
  3.     ADD gpsx BIT DEFAULT NULL
  4.  

Kód: MySQL [Vybrat]
  1. IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'testovaci' AND COLUMN_NAME = 'gpsx')
  2.   ALTER TABLE `dbo.testovaci`
  3.     ADD gpsx BIT DEFAULT NULL
  4.  

Kód: MySQL [Vybrat]
  1. IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'testovaci' AND COLUMN_NAME = 'gpsx')
  2.   ALTER TABLE `testovaci`
  3.     ADD gpsx BIT DEFAULT NULL
  4.  

Kód: MySQL [Vybrat]
  1. IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'testovaci' AND COLUMN_NAME = 'gpsx')
  2.   ALTER TABLE 'testovaci'
  3.     ADD gpsx BIT DEFAULT NULL
  4.  

ani jeden z uvedenych prikladu nefunguje a paklize na 3 radek vlozim `tak to pise hned 2 errory:
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near '`'.
Msg 102, Level 15, State 1, Line 4
Incorrect syntax near 'gpsx'.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 568
  • Karma: 23
Re:IF NOT EXIST
« Odpověď #4 kdy: 01-08-2012, 12:34:34 »
Ne, at udelam, obe moznosti, ktere jste mi zde nastinili, tak ani jedna neni funkcni...

no je fakt, že tu chybu ti nejspíš hlásí ten alter a ne subselect. V subselectu máš mít string ', v alter buď nic nebo `

zkus alter table dbo.testovaci nebo `dbo`.`testovaci`

Jseš si jistý, že jsi ve správné db a ta tabulka existuje? Zkus select * from nazevtabulky.

Některé db ještě můžou za některých okolností rozlišovat velikost písmen, takže testovaci a Testovaci je něco jiného

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Re:IF NOT EXIST
« Odpověď #5 kdy: 01-08-2012, 12:43:26 »
SELECT * FROM [TestovaciDB].[dbo].[testovaci] toto funguje, kdyz toto dam do toho meto prikazu:

IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'testovaci' AND COLUMN_NAME = 'gpsx')
BEGIN
  ALTER TABLE [TestovaciDB].[dbo].[testovaci]
    ADD gpsx BIT DEFAULT NULL
END

napise to v podstate, ze sloupecek existuje, coz je dobre, ale neskonci to s chybou?
Msg 2705, Level 16, State 4, Line 3
Column names in each table must be unique. Column name 'gpsx' in table 'TestovaciDB.dbo.testovaci' is specified more than once.

tedy, nemelo by to probehnout bez hlaseni, kdyz je tam podminka IF NOT EXISTS? Proste jen probehnout a bud se prida, nebo ne?

Offline Fala

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: XE2
    • Software pro poskytování technické podpory
Re:IF NOT EXIST
« Odpověď #6 kdy: 01-08-2012, 16:43:02 »
napise to v podstate, ze sloupecek existuje, coz je dobre, ale neskonci to s chybou?
Msg 2705, Level 16, State 4, Line 3
Column names in each table must be unique. Column name 'gpsx' in table 'TestovaciDB.dbo.testovaci' is specified more than once.

tedy, nemelo by to probehnout bez hlaseni, kdyz je tam podminka IF NOT EXISTS? Proste jen probehnout a bud se prida, nebo ne?
abych pravdu řekl, tak ti vůbec nerozumím?  ty dvě věty si nějak protiřečí. Pokud chceš to hlášení, tak udělej jenom alter table. pokud tam bude, tak se stejnak nepřidá a hodí hlášku.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 568
  • Karma: 23
Re:IF NOT EXIST
« Odpověď #7 kdy: 01-08-2012, 19:33:05 »
tedy, nemelo by to probehnout bez hlaseni, kdyz je tam podminka IF NOT EXISTS? Proste jen probehnout a bud se prida, nebo ne?

buď by to mělo přidat nebo neudělat nic. Podle toho, co píšeš, to ale vypadá, že si prostě přihlášený do jiné db než si myslíš. Zkus schválně, co vrátí

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'testovaci' AND COLUMN_NAME = 'gpsx'

Information schema je definované pro každou db, takže buď si nastav aktivní db (v connection stringu nebo příkazem, třeba v mssql se to dělalo přes "use mojedb") nebo zkus nazevdb.information_schema.

Názvy db bych ale do sql dotazů nedával (pokud nepotřebuješ jeden dotaz pouštět zároveň proti objektům z různých db)

Offline Jan Fiala

  • Příspěvků: 49
  • Karma: 0
    • PSPad editor
Re:IF NOT EXIST
« Odpověď #8 kdy: 03-08-2012, 06:50:59 »
Zkus tohle:

Kód: MySQL [Vybrat]
  1. if (select col_length('testovaci', 'gpsx')) is not null
  2.   -- tady si napis, co potrebujes
  3.  

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Re:IF NOT EXIST
« Odpověď #9 kdy: 03-08-2012, 11:51:30 »
tedy, nemelo by to probehnout bez hlaseni, kdyz je tam podminka IF NOT EXISTS? Proste jen probehnout a bud se prida, nebo ne?

buď by to mělo přidat nebo neudělat nic. Podle toho, co píšeš, to ale vypadá, že si prostě přihlášený do jiné db než si myslíš. Zkus schválně, co vrátí

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'testovaci' AND COLUMN_NAME = 'gpsx'

Information schema je definované pro každou db, takže buď si nastav aktivní db (v connection stringu nebo příkazem, třeba v mssql se to dělalo přes "use mojedb") nebo zkus nazevdb.information_schema.

Názvy db bych ale do sql dotazů nedával (pokud nepotřebuješ jeden dotaz pouštět zároveň proti objektům z různých db)

Zkoušel jsem tvůj sql dotaz : SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'testovaci' AND COLUMN_NAME = 'gpsx' tento dotaz nic nevrátil, což je velmi divné. Doplnil jsem tento dotaz o dalsi tvoji radu: SELECT * FROM TestovaciDB.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'testovaci' AND COLUMN_NAME = 'gpsx' toto už vrátilo v MS SQL MANAGERU jakousi tabulku, kde jsou sloupce a za pomlckou hodnoty:

TABLE_CATALOG - TestovaciDB   
TABLE_SCHEMA - dbo   
TABLE_NAME - testovaci   
COLUMN_NAME - gpsx   
ORDINAL_POSITION   - 6
COLUMN_DEFAULT - NULL   
IS_NULLABLE - YES
DATA_TYPE - real
CHARACTER_MAXIMUM_LENGTH - NULL
CHARACTER_OCTET_LENGTH - NULL
NUMERIC_PRECISION - 24
NUMERIC_PRECISION_RADIX - 2    
NUMERIC_SCALE - NULL
DATETIME_PRECISION - NULL   
CHARACTER_SET_CATALOG - NULL   
CHARACTER_SET_SCHEMA - NULL   
CHARACTER_SET_NAME - NULL   
COLLATION_CATALOG - NULL   
COLLATION_SCHEMA - NULL   
COLLATION_NAME - NULL   
DOMAIN_CATALOG - NULL   
DOMAIN_SCHEMA - NULL   
DOMAIN_NAME - NULL

Jan Fiala: Dobry den, vase ukazka: if (select col_length('testovaci', 'gpsx')) is not null funguje, pokud neni null, ne? Tedy pokud to neco najde. Ostatne, prikaz se provede bez jakekoli chyby. Ale sloupecek se neprida, i kdyz neexistuje:

Kód: MySQL [Vybrat]
  1. if (select col_length('testovaci', 'accuracy')) IS NOT NULL
  2.     ALTER TABLE [TestovaciDB].[dbo].[testovaci]
  3.     ADD accuracy BIT DEFAULT NULL
  4.  

zkousel jsem to i takto:
Kód: MySQL [Vybrat]
  1. if (select col_length('testovaci', 'accuracy')) IS NULL
  2.     ALTER TABLE [TestovaciDB].[dbo].[testovaci]
  3.     ADD accuracy BIT DEFAULT NULL
  4.  

sloupecek se prida, pokud neexistuje, pokud existuje dole to napise vyjimku:

"Msg 2705, Level 16, State 4, Line 2
Column names in each table must be unique. Column name 'accuracy' in table 'TestovaciDB.dbo.testovaci' is specified more than once."

to by delat nemelo, ne? paklize neni splnena podminka, prikaz za ni by to melo preskocit... A nepokouset se vytvorit sloupecek... Ne?

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 568
  • Karma: 23
Re:IF NOT EXIST
« Odpověď #10 kdy: 03-08-2012, 12:50:09 »
Zkoušel jsem tvůj sql dotaz : SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'testovaci' AND COLUMN_NAME = 'gpsx' tento dotaz nic nevrátil, což je velmi divné. Doplnil jsem tento dotaz o dalsi tvoji radu: SELECT * FROM TestovaciDB.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'testovaci' AND COLUMN_NAME = 'gpsx' toto už vrátilo v MS SQL MANAGERU jakousi tabulku, kde jsou sloupce a za pomlckou hodnoty:

nevím, co je na tom divného. Prostě polovinu dotazu pouštíš proti aktuální db a druhou proti definované, to je pak jasné, že nemůže fungovat. Prostě všude vyhoď název databáze a před provedením dotazu se přepni na db, ve které tu změnu chceš dělat. To se udělá buď v connection stringu nebo na mssql příkazem USE (ale lepší je ten conn. string)

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Re:IF NOT EXIST
« Odpověď #11 kdy: 06-08-2012, 13:35:29 »
tak jsem to rozlousknul, tedy alespon takhle mi to funguje v tom Microsoft SQL Server Management Studiu.
Zda to takto bude fungovat i v C#, to je otazka, kterou zjistim co nevidet :)

Kód: MySQL [Vybrat]
  1. IF NOT EXISTS(SELECT * FROM [TestovaciDB].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'testovaci' AND COLUMN_NAME = 'accuracy')
  2.   ALTER TABLE [TestovaciDB].[dbo].[testovaci]
  3.     ADD accuracy BIT DEFAULT NULL
  4.  

kdybych ale tento kod chtel dat do nejake procedury, jak by to bylo?
« Poslední změna: 06-08-2012, 14:06:05 od erdt.martin »

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: