migracja skryptu SQL z Interbase do MSSQL 2005 Exp.
Sowiecki Agent - 30-03-2007 00:07
migracja skryptu SQL z Interbase do MSSQL 2005 Exp.
Witam! Mam prosbe do bieglych w mssql, musze wyexportowac metadane sporej bazy z interbase do MSSQL. Przygotowalem fikcyjne 3 tabele, procedury(no procz jednej), generatory i wyzwalacze, czy ktos bylby tak mily i zamienil ten kod na sql zgody z MSSQL ? Wiedzialbym wtedy co i jak zamieniac.
wklejam +++++++++++++++++++++++++++
/************************************************** ****************************/ /**** Generated by IBExpert 2006.10.14 2007-03-29 14:52:10 ****/ /************************************************** ****************************/
SET SQL DIALECT 3;
SET NAMES WIN1250;
/************************************************** ****************************/ /**** Generators ****/ /************************************************** ****************************/
CREATE GENERATOR GEN_TABLICA_PIERWSZA_ID; SET GENERATOR GEN_TABLICA_PIERWSZA_ID TO 0;
CREATE GENERATOR GEN_TAB_NAGL_ID; SET GENERATOR GEN_TAB_NAGL_ID TO 0;
CREATE GENERATOR GEN_TAB_SZCZ_ID; SET GENERATOR GEN_TAB_SZCZ_ID TO 0;
SET TERM ^ ;
/************************************************** ****************************/ /**** Stored Procedures ****/ /************************************************** ****************************/
CREATE PROCEDURE NOWY_ID_TAB RETURNS ( V_ID_TAB INTEGER) AS BEGIN EXIT; END^
CREATE PROCEDURE NOWY_NUMER_DLA_TAB ( V_ID_TAB INTEGER, V_SERIA VARCHAR(10)) RETURNS ( V_NUMER_TAB VARCHAR(50)) AS BEGIN EXIT; END^
SET TERM ; ^
/************************************************** ****************************/ /**** Tables ****/ /************************************************** ****************************/
CREATE TABLE TAB_NAGL ( ID_TAB_NAGL INTEGER NOT NULL, JAKIES_DANE VARCHAR(10), SERIA VARCHAR(10), NUMER INTEGER, DOPISEK VARCHAR(30) );
CREATE TABLE TAB_SZCZ ( ID_TAB_SZCZ INTEGER NOT NULL, ID_TAB_NAGL INTEGER NOT NULL, KWOTA NUMERIC(15,2) );
CREATE TABLE TABLICA_PIERWSZA ( ID_TABLICA_PIERWSZA INTEGER NOT NULL, KWOTA NUMERIC(15,2), NAZWA VARCHAR(10), CZAS TIMESTAMP, DATA DATE, OPIS BLOB SUB_TYPE 1 SEGMENT SIZE 80 );
/************************************************** ****************************/ /**** Primary Keys ****/ /************************************************** ****************************/
ALTER TABLE TABLICA_PIERWSZA ADD CONSTRAINT PK_TABLICA_PIERWSZA PRIMARY KEY (ID_TABLICA_PIERWSZA); ALTER TABLE TAB_NAGL ADD CONSTRAINT PK_TAB_NAGL PRIMARY KEY (ID_TAB_NAGL); ALTER TABLE TAB_SZCZ ADD CONSTRAINT PK_TAB_SZCZ PRIMARY KEY (ID_TAB_SZCZ);
/************************************************** ****************************/ /**** Foreign Keys ****/ /************************************************** ****************************/
ALTER TABLE TAB_SZCZ ADD CONSTRAINT FK_TAB_SZCZ_1 FOREIGN KEY (ID_TAB_NAGL) REFERENCES TAB_NAGL (ID_TAB_NAGL);
/************************************************** ****************************/ /**** Triggers ****/ /************************************************** ****************************/
SET TERM ^ ;
/************************************************** ****************************/ /**** Triggers for tables ****/ /************************************************** ****************************/
/* Trigger: TAB_SZCZ_BI */ CREATE TRIGGER TAB_SZCZ_BI FOR TAB_SZCZ ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.ID_TAB_SZCZ IS NULL) THEN NEW.ID_TAB_SZCZ = GEN_ID(GEN_TAB_SZCZ_ID,1); END ^
SET TERM ; ^
/************************************************** ****************************/ /**** Stored Procedures ****/ /************************************************** ****************************/
SET TERM ^ ;
ALTER PROCEDURE NOWY_ID_TAB RETURNS ( V_ID_TAB INTEGER) AS declare variable v_id integer; begin v_id = gen_id("GEN_TAB_NAGL_ID",1);
v_id_tab = v_id;
suspend; end ^
ALTER PROCEDURE NOWY_NUMER_DLA_TAB ( V_ID_TAB INTEGER, V_SERIA VARCHAR(10)) RETURNS ( V_NUMER_TAB VARCHAR(50)) AS declare variable tmpdate date; declare variable zmienna1 integer; declare variable zmienna2 integer; declare variable v_dopisek varchar(20); declare variable v_numer integer; begin select cast('now' as date) from rdb$database into tmpdate; zmienna1=extract(month from tmpdate); zmienna2=extract(year from tmpdate); v_dopisek = (zmienna1||'/'||zmienna2); SELECT coalesce(max(numer),0) FROM tab_nagl WHERE seria = :v_seria and dopisek = :v_dopisek INTO :v_numer; v_numer = (v_numer + 1);
UPDATE tab_nagl SET seria = :v_seria , numer = :v_numer , dopisek = :v_dopisek WHERE id_tab_nagl = :v_id_tab;
v_numer_tab = (v_seria||'/'||v_numer||'/'||v_dopisek); suspend; end ^
SET TERM ; ^
+++++++++++++++++++++++++++
-- http://www.niesfornazyta.pl/ Pierwszy stacjonarny czytnik for typu phpBB/phpBBbyPrzemo (windows/linux) Od dziś możesz korzystać z fora tak jak z usenetu !
wloochacz - 30-03-2007 00:07
> Witam! > Mam prosbe do bieglych w mssql, musze wyexportowac metadane sporej bazy > z interbase do MSSQL. Przygotowalem fikcyjne 3 tabele, procedury(no > procz jednej), generatory i wyzwalacze, czy ktos bylby tak mily i > zamienil ten kod na sql zgody z MSSQL ? Wiedzialbym wtedy co i jak > zamieniac. Odpalić i działa :) Uwaga: Zmieniłem typ pól id z int na uniqueidentifier - w MSSQL nie ma generatorów! Nie ma też triggerów Before - żenada :P A na początku z polami typu identity będziesz miał problemy...
-- wlooochacz
-- SQL Manager 2005 for SQL Server (2.6.0.2) -- --------------------------------------- -- Host : 192.176.16.80\DEV2K -- Database : Sowiecki -- Version : Microsoft SQL Server 8.00.760
-- -- Dropping foreign key FK__TAB_SZCZ__ID_TAB__7B905C75 : --
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[FK__TAB_SZCZ__ID_TAB__7B905C75]') AND OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[TAB_SZCZ] DROP CONSTRAINT [FK__TAB_SZCZ__ID_TAB__7B905C75] GO
-- -- Dropping stored procedure NOWY_ID_TAB : --
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[NOWY_ID_TAB]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1) DROP PROCEDURE [dbo].[NOWY_ID_TAB] GO
-- -- Dropping stored procedure NOWY_NUMER_DLA_TAB : --
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[NOWY_NUMER_DLA_TAB]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1) DROP PROCEDURE [dbo].[NOWY_NUMER_DLA_TAB] GO
-- -- Dropping table TAB_NAGL : --
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[TAB_NAGL]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) DROP TABLE [dbo].[TAB_NAGL] GO
-- -- Dropping table TAB_SZCZ : --
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[TAB_SZCZ]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) DROP TABLE [dbo].[TAB_SZCZ] GO
-- -- Dropping table TABLICA_PIERWSZA : --
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[TABLICA_PIERWSZA]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) DROP TABLE [dbo].[TABLICA_PIERWSZA] GO
-- -- Definition for table TAB_NAGL : --
CREATE TABLE [dbo].[TAB_NAGL] ( [ID_TAB_NAGL] uniqueidentifier NOT NULL, [JAKIES_DANE] varchar(10) COLLATE Polish_CI_AS NULL, [SERIA] varchar(10) COLLATE Polish_CI_AS NULL, [NUMER] int NULL, [DOPISEK] varchar(30) COLLATE Polish_CI_AS NULL ) ON [PRIMARY] GO
-- -- Definition for table TAB_SZCZ : --
CREATE TABLE [dbo].[TAB_SZCZ] ( [ID_TAB_SZCZ] uniqueidentifier NOT NULL, [ID_TAB_NAGL] uniqueidentifier NOT NULL, [KWOTA] numeric(15, 2) NULL ) ON [PRIMARY] GO
-- -- Definition for table TABLICA_PIERWSZA : --
CREATE TABLE [dbo].[TABLICA_PIERWSZA] ( [ID_TABLICA_PIERWSZA] uniqueidentifier NOT NULL, [KWOTA] numeric(15, 2) NULL, [NAZWA] varchar(10) COLLATE Polish_CI_AS NULL, [CZAS] datetime NULL, [DATA] datetime NULL, [OPIS] text COLLATE Polish_CI_AS NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO
-- -- Definition for indices : --
ALTER TABLE [dbo].[TAB_NAGL] ADD PRIMARY KEY CLUSTERED ([ID_TAB_NAGL]) ON [PRIMARY] GO
ALTER TABLE [dbo].[TAB_SZCZ] ADD PRIMARY KEY CLUSTERED ([ID_TAB_SZCZ]) ON [PRIMARY] GO
ALTER TABLE [dbo].[TABLICA_PIERWSZA] ADD PRIMARY KEY CLUSTERED ([ID_TABLICA_PIERWSZA]) ON [PRIMARY] GO
-- -- Definition for foreign keys : --
ALTER TABLE [dbo].[TAB_SZCZ] ADD FOREIGN KEY ([ID_TAB_NAGL]) REFERENCES [dbo].[TAB_NAGL] ([ID_TAB_NAGL]) ON UPDATE NO ACTION ON DELETE NO ACTION GO
-- -- Definition for stored procedure NOWY_ID_TAB : --
CREATE PROCEDURE [dbo].NOWY_ID_TAB(@V_ID_TAB uniqueidentifier out) AS begin set nocount on;
set @V_ID_TAB = newid();
set nocount off; end GO
-- -- Definition for stored procedure NOWY_NUMER_DLA_TAB : --
CREATE PROCEDURE [dbo].NOWY_NUMER_DLA_TAB(@V_ID_TAB uniqueidentifier, @V_SERIA varchar(10), @V_NUMER_TAB VARCHAR(50) out) AS begin declare @tmpdate datetime; declare @zmienna1 integer; declare @zmienna2 integer; declare @v_dopisek varchar(20); declare @v_numer integer;
set nocount on;
set @tmpdate = getdate(); set @zmienna1 = datepart(mm, @tmpdate); set @zmienna2 = datepart(y, @tmpdate);
set @v_dopisek = @zmienna1 + '/' + @zmienna2;
select @V_NUMER = coalesce(max(A.NUMER), 0) from TAB_NAGL A where A.SERIA = @V_SERIA and A.DOPISEK = @V_DOPISEK;
set @v_numer = @v_numer + 1;
update TAB_NAGL set SERIA = @V_SERIA, NUMER = @V_NUMER, DOPISEK = @V_DOPISEK where ID_TAB_NAGL = @V_ID_TAB;
set @v_numer_tab = @v_seria+'/'+@v_numer+'/'+@v_dopisek;
set nocount off; end GO
wloochacz - 30-03-2007 00:07
[ciach] Nie ma też triggerów Before - żenada :P No tak - jest instead of, ale Firebirdowy Before jest duuużo bardziej przyjemniejszy... ;-)
-- wloochacz
Sowiecki Agent - 30-03-2007 00:07
wloochacz napisał(a): > [ciach] > Nie ma też triggerów Before - żenada :P > No tak - jest instead of, ale Firebirdowy Before jest duuużo bardziej > przyjemniejszy... ;-) >
:)) ogromne dzieki, z samego rana zabieram sie za zmiane wszystkiego i ... dalej juz na lang.delphi bede trul :)
Pozdrawiam P
ps. jakie problemy z polami Identity? Jak sie domyslam jest to ciag liter i cyfr ( ztego co pamietam), czy jest zatem sposob na wygenerowanie samych cyfr, chodzi o to bym z poziomu delphi widzial pole integer, po to azebym nie musial przy zmainie silnika bazy danych zmieniac pol we wszystkich komponentach.
-- http://www.niesfornazyta.pl/ Pierwszy stacjonarny czytnik for typu phpBB/phpBBbyPrzemo (windows/linux) Od dziś możesz korzystać z fora tak jak z usenetu !
wloochacz - 30-03-2007 00:07
[ciach] > ps. > jakie problemy z polami Identity? > Jak sie domyslam jest to ciag liter i cyfr ( ztego co pamietam), czy Tym jest uniqueidentifier - to jest po prostu GUID, mapowany w FB jako char(38)...
> jest zatem sposob na wygenerowanie samych cyfr, chodzi o to bym z > poziomu delphi widzial pole integer, po to azebym nie musial przy > zmainie silnika bazy danych zmieniac pol we wszystkich komponentach. Przestań się domyślać i zacznij czytać dokumentację ;-) Identity to jest pole typu całkowitego, którego wartość jest nadawana przez serwer i jest ściśle związana z definicją pola w tabeli (zupełnie inaczej niż generator w FB). Nie można wprost takiego pola modyfikować, trzeba powiadomić MSSQL, że chcesz zmienić wartość w takim polu. Skoro nie można dodawać, to nie można się dowiedzieć jaka jest wartość w tym polu, co sprawia kłopot przy trybach CachedUpdates... Oczywiście AnyDAC umie sobie z tym poradzić :) Wybaczcie lekkie OT ;-)
-- wloochacz
Sowiecki Agent - 31-03-2007 00:06
>> jest zatem sposob na wygenerowanie samych cyfr, chodzi o to bym z >> poziomu delphi widzial pole integer, po to azebym nie musial przy >> zmainie silnika bazy danych zmieniac pol we wszystkich komponentach. > Przestań się domyślać i zacznij czytać dokumentację ;-) > Identity to jest pole typu całkowitego, którego wartość jest nadawana > przez serwer i jest ściśle związana z definicją pola w tabeli (zupełnie > inaczej niż generator w FB). Nie można wprost takiego pola modyfikować, > trzeba powiadomić MSSQL, że chcesz zmienić wartość w takim polu. > Skoro nie można dodawać, to nie można się dowiedzieć jaka jest wartość w > tym polu, co sprawia kłopot przy trybach CachedUpdates... Oczywiście > AnyDAC umie sobie z tym poradzić :) > Wybaczcie lekkie OT ;-) >
no wiec zostaje przy intach w polach ID zeby pozniej nie bylo problemu przy przenoszeniu. Tylko mam pytanie, w jaki sposob uzyskac kolejny id dla pola int z opcja identity z poziomu procedury , dla uniqueidentifier jak pisales wystarczy wywolac:
set @V_ID_TAB = newid();
a ja tutaj chcialbym kolejny unikalny dla konkretnej tabeli. W jaki sposob uzyskac i czy w momencie gdy go pobiore ja i 'ktos jeszcze' przy czym ja nie zapisze w miedzyczaqsie rekordu to czy ten 'ktos jeszcze' dostanie inna wartosc niz ja (czyli jak generator w Firebird).
(docelowo bede miec mase tabel i komponentow zmiana kluczowych pol nie wchodzi w gre, musialbym przygotowac trzy rozne wersje. A chce by od strony aplikacji (poza polaczeniem) nie mialo znaczenia z jakiej bazy sie kporzysta, a co za tym idzie nie chce uzywac roznych typow pol dlatego sie czepiam tego uni cos tam ifier).
P.
-- http://www.niesfornazyta.pl/ Pierwszy stacjonarny czytnik for typu phpBB/phpBBbyPrzemo (windows/linux) Od dziś możesz korzystać z fora tak jak z usenetu !
Sowiecki Agent - 31-03-2007 00:06
dobra nie bylo pytania, wlasnieprzejrzalem dokument migracji z MSSQL do firebird i zalaplem o czym piszesz.
Po rpostu przy tworzeniu tabel w firebird jako pole id ustawie char(38) i wykorzystam UDFa ktory pobierze mi w wyzwalaczu before insert (odpowiednik instead of MSSQL) unikalny 'numer' na serwerze tym samym od strony aplikacji nic sie nie zmieni.
tak czy siak dzieki :)
-- http://www.niesfornazyta.pl/ Pierwszy stacjonarny czytnik for typu phpBB/phpBBbyPrzemo (windows/linux) Od dziś możesz korzystać z fora tak jak z usenetu !
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
jak to =?ISO-8859-2?Q?zrobi=E6=2E=2E=2E=3F_TSQL_sql_server?==?ISO-8859-2?Q?_?=
=?iso-8859-2?Q?=5BMS_SQL=5D_Czy_mo=BFna_wywo=B3a=E6_funkcje_t ylko_raz_dla?==?iso-8859-2?Q?_ca=B3ego_zbioru_=BCr=F3d=B3owego=3F?=
=?ISO-8859-2?Q?k=B3opot_z_uruchomieniem_MY_SQL_dla_C?==?ISO-8859-2?Q?MS_i_CRM_na_Fedora_Core_3?=
Oracle PL/SQL Wstawianie =?ISO-8859-2?Q?wynik=F3w_kolekcji_d?==?ISO-8859-2?Q?o_tabeli?=
=?iso-8859-2?Q?=5Bmssql=5D_Zapytania_rekurencyjne__-_czy_sk=B3adnia_sql?==?iso-8859-2?Q?_co=B6_takiego_przewiduje_=3F?=
[Oracle PL/SQL] Cursor i zapis =?ISO-8859-2?Q?rekord=F3w_do_?==?ISO-8859-2?Q?kolejnych_plik=F3w?=
=?iso-8859-2?Q?=5BMySQL=5D_Co_minimalnie_potrzebne_zeby_mie=E 6_klienta_My?==?iso-8859-2?Q?SQL_na_Linuxie=3F?=
[newbie] MS SQL - praca =?ISO-8859-2?Q?jednocze=B6nie_na_2_?==?ISO-8859-2?Q?bazach_=28linkowanie_=3F=29?=
ms sql server - =?ISO-8859-2?Q?domy=B6lny_format_kolumn_ty?==?ISO-8859-2?Q?pu_datetime?=
[oracle] - Oracle SQL Developer - co to jest SID?
zanotowane.pldoc.pisz.plpdf.pisz.plwawa19wwa91.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 |
|