[MSSQL] nazwa bazy danych w zmiennej
kinde - 13-11-2006 00:47
[MSSQL] nazwa bazy danych w zmiennej
Witam Jak poprawnie napisać ponizszy skrypt:
DECLARE @nazwa_bazy varchar (50) SET @nazwa_bazy = 'baza' USE @nazwa_bazy
wyskakuje blad incorrect syntax
pozdrawiam kinde
Marcin A. Guzowski - 13-11-2006 00:47
kinde napisał(a): > Witam > Jak poprawnie napisać ponizszy skrypt: > (..)
Nijak. Tak się tego nie robi. Można zastosować dynamiczny SQL i to w określonych sytuacjach zadziała zgodnie z oczekiwaniami, ale ma też wiele minusów.
-- Pozdrawiam, Marcin Guzowski http://guzowski.info
kinde - 13-11-2006 00:47
>> Jak poprawnie napisać ponizszy skrypt: >> (..) > Nijak. > Tak się tego nie robi. Można zastosować dynamiczny SQL > i to w określonych sytuacjach zadziała zgodnie z > oczekiwaniami, ale ma też wiele minusów.
ok wyglada wiec na to, ze w takim razie w ogole nie mozna zmienic kontekstu bazy danych (np. w qa) uzywajac zmiennej jako nazwy? bo exec zmienia kontekst bazy jedynie na czas wykonania execa...
pozdrawiam kinde
Marcin A. Guzowski - 13-11-2006 00:47
kinde napisał(a): > ok > wyglada wiec na to, ze w takim razie w ogole nie mozna > zmienic kontekstu bazy danych (np. w qa) uzywajac zmiennej jako nazwy? > bo exec zmienia kontekst bazy jedynie na czas wykonania execa...
Poczekaj bo troszkę mieszasz.
Wywołanie: EXEC baza_danych.shemat.procedura @zmienna
to nie żadna zmiana kontekstu tylko pełna kwalifikacja nazwy obiektu (procedury). Kontekst bazy danych dotyczy natomiast sesji, a właściwie - batcha, czyli zbioru wyrażeń jednocześnie przesłanych do SQL Servera. Powyższy fragment kodu może być więc wywołany w kontekście bazy_1, bazy_2 itd., a mimo to odpali procedurę z bazy baza_danych.
Powiedz co chcesz zrobić, to pomyślimy o prawidłowym rozwiązaniu. Chyba, że upewniasz się tylko co do możliwych funkcjonalności.
-- Pozdrawiam, Marcin Guzowski http://guzowski.info
qqruźNIK - 13-11-2006 00:48
kinde napisał:
> wyglada wiec na to, ze w takim razie w ogole nie mozna > zmienic kontekstu bazy danych (np. w qa) uzywajac zmiennej jako nazwy? > bo exec zmienia kontekst bazy jedynie na czas wykonania execa...
Ale robiłeś to tak:
DECLARE @nazwa_bazy varchar (50) SET @nazwa_bazy = 'baza'
exec 'use ' + @nazwa_bazy
Nie mam u siebie MSSQLa więc nie mogę sprawdzić ale o ile pamiętam to takie cos powinno zadziałać.
------------ qqruźNIK
Marcin A. Guzowski - 14-11-2006 00:08
qqruźNIK napisał(a): > Ale robiłeś to tak: > > DECLARE @nazwa_bazy varchar (50) > SET @nazwa_bazy = 'baza' > > exec 'use ' + @nazwa_bazy
Po 1. Trzeba dodać nawiasy do EXECa, żeby to w ogóle się wykonało.
Po 2. Nawet poprawnie napisany skrypt nie rozwiązuje problemu, gdyż kontekst bazy ze zmiennej @nazwa_bazy istnieje tylko w obrębie kodu dynamicznego SQLa, czyli tego co władowane jest do EXECa:
DECLARE @database sysname; SET @database = 'moja_baza'; EXEC ('USE '+@database+'; SELECT 1;'); SELECT 2;
SELECT 1 wykonywany jest w kontekście bazy moja_baza, natomiast SELECT 2 - już nie.
Post czy dwa wcześniej pisałem o możliwości zastosowania dynamicznego SQLa (czyli na zasadzie takiej jak SELECT 1) - to jedyna droga, jeżeli już koniecznie trzeba coś takiego robić.
-- Pozdrawiam, Marcin Guzowski http://guzowski.info
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?=
[laik]Jak =?ISO-8859-2?Q?stworzy=E6/zaczac_tworzyc__ma=B3=B1?==?ISO-8859-2?Q?__baz=EA_danych_na_potrzeby_www=3F?=
[mysql] przenoszenie danych =?ISO-8859-2?Q?mi=EAdzy_tabelami_?==?ISO-8859-2?Q?w_r=F3=BFnych_bazach?=
Ksiazka - "Podstawowy =?ISO-8859-2?Q?wyk=B3ad_z_system=F3w_?==?ISO-8859-2?Q?baz_danych=22?=
Zrywanie =?ISO-8859-2?Q?po=B3aczen_z_baza_danych_-_pos?==?ISO-8859-2?Q?tgresql_=3C-=3E_odbc?=
Zdalny =?ISO-8859-2?Q?dost=EAp_do_MSSQL_bez_zarz=B1dzani?==?ISO-8859-2?Q?a?=
[MSSQL] =?ISO-8859-2?Q?zgodno=B6ci_z_licencjami_Microsoft_?==?ISO-8859-2?Q?SQL_Server?=
[MSSQL 2k] - jak =?ISO-8859-2?Q?pod=B3=B1czy=E6_serwer_na_?==?ISO-8859-2?Q?porcie_innym_ni=BF_1433=3F?=
MSSQL Express czy Oracle Express
MSSQL 2005 i uruchamianie procedury o =?ISO-8859-2?Q?okre=B6lone?==?ISO-8859-2?Q?j_godzinie?=
zanotowane.pldoc.pisz.plpdf.pisz.plmisida.pev.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|