06. september 2017 - 09:40Der er
10 kommentarer og 3 løsninger
Oprette Stored procedure
Stored procedure er helt nyt for mig, men jeg vil gerne bruge det til at hente nogle data fra een server og indsætte disse data i en anden server, til brug for statistik m.m.
Er der nogen der kan hjælpe mig med at lave nedenstående insert/select sætning om, så den kan gemmes som stored procedure ? Der hentes nogle data fra en produktions server, disse indsættes så i en tabel på en statistik server. Nedenstående SQL virker manuelt, men jeg ville gerne have den til at køre een gang i døgnet vha en stored procedure.
from "SERVER_ZYX,58038".ZYX.dbo.O08T1, "SERVER_ZYX,58038".ZYX.dbo.L62T1, "SERVER_ZYX,58038".ZYX.dbo.O04T1 Where O04T1.deldate > dateadd(day, -1, GETDATE()) and O04T1.deldate < dateadd(day, 0, GETDATE()) and
O08T1.shortl62 = L62T1.shortl62 AND O08T1.shorto04 = O04T1.shorto04 AND O04T1.r00key NOT LIKE ('DKRUS%') AND O04T1.r00key NOT LIKE ('ERROR') AND O04T1.r00key NOT LIKE ('DKC6%') AND O04T1.r00key NOT LIKE ('DKC8%') AND O04T1.r00key NOT LIKE ('DKC9%') AND O04T1.r00key NOT LIKE ('9%') AND L62T1.pmha IN ('40','60','62')
from "SERVER_ZYX,58038".ZYX.dbo.O08T1, "SERVER_ZYX,58038".ZYX.dbo.L62T1, "SERVER_ZYX,58038".ZYX.dbo.O04T1 Where O04T1.deldate > dateadd(day, -1, GETDATE()) and O04T1.deldate < dateadd(day, 0, GETDATE()) and
O08T1.shortl62 = L62T1.shortl62 AND O08T1.shorto04 = O04T1.shorto04 AND O04T1.r00key NOT LIKE ('DKRUS%') AND O04T1.r00key NOT LIKE ('ERROR') AND O04T1.r00key NOT LIKE ('DKC6%') AND O04T1.r00key NOT LIKE ('DKC8%') AND O04T1.r00key NOT LIKE ('DKC9%') AND O04T1.r00key NOT LIKE ('9%') AND L62T1.pmha IN ('40','60','62')
Group by O04T1.deldate
order by O04T1.deldate desc
Synes godt om
1 synes godt om dette
Slettet bruger
06. september 2017 - 11:29#2
Og så kan du lave et SQL Job, der fyerer exec dbo.Opfyldning afsted. Du kan også bare smide hele din SQL ind.
Ovenstående virker perfekt, men jeg kunne godt tænke mig en lille udvidelse.
Hvis jeg fyrer denne kommando af mere en een gang, så indsætter den alle tal flere gange, dvs jeg kan få flere dato/tal der er ens og så bliver det hele jo pludselig dobbelt op eller mere. Kan man lave et tjek, så den tjekker om tallet findes (dato,tal) hvis tallet ikke findes så skal det oprettes, hvis tallet /dato findes så skal den blot opdatere det.
Ændrer lige lidt på min formulering Det er selvfølgelig dato den skal tjekke på, for ant supp_paller kan selvfølgelig godt være det samme både i dag og i morgen.
Synes godt om
Slettet bruger
08. september 2017 - 09:21#6
Hej,
Du kan gøre 2 ting som jeg ser det.
1: Da du alligevel hver gang henter hele dit dataset, så kan du ligeså godt smide en truncate ind.
CREATE PROCEDURE dbo.opfyldning as
truncate table dbo.opfyldning;
insert into opfyldning (Levdato, Supp_paller)..............................................
2: Hvis du ved du kun få en entry på din dato, eller du ved du har læst alt ind på den pågældende dato (altså der ikke kommer mere ind på din dato, så kan du lave en where not exists)
from "SERVER_ZYX,58038".ZYX.dbo.O08T1, "SERVER_ZYX,58038".ZYX.dbo.L62T1, "SERVER_ZYX,58038".ZYX.dbo.O04T1 AS A Where O04T1.deldate > dateadd(day, -1, GETDATE()) and O04T1.deldate < dateadd(day, 0, GETDATE()) and
O08T1.shortl62 = L62T1.shortl62 AND O08T1.shorto04 = O04T1.shorto04 AND O04T1.r00key NOT LIKE ('DKRUS%') AND O04T1.r00key NOT LIKE ('ERROR') AND O04T1.r00key NOT LIKE ('DKC6%') AND O04T1.r00key NOT LIKE ('DKC8%') AND O04T1.r00key NOT LIKE ('DKC9%') AND O04T1.r00key NOT LIKE ('9%') AND L62T1.pmha IN ('40','60','62')
and not exists ( select Dato from dbo.opfyldning as B where a.deldate= b.deldate)
Group by O04T1.deldate
order by O04T1.deldate desc
Synes godt om
1 synes godt om dette
Slettet bruger
08. september 2017 - 09:22#7
Og der skulle selvf stå deldate i den indre select - men jeg håber du forstår :)
Tak for hurtigt svar plaidDK Jeg er ret ny i dette, så jeg forstår ikke helt.
Kan se du mangler lidt oplysninger, som jeg har taget for givet ;-) Data bliver hentet fra et lagersystem og i dette lager system får jeg de seneste 30 dage, hver gang jeg forespørger. Jeg vil gerne gemme disse tal mere end 30 dage, for at kunne føre statistik, derfor har jeg lavet en ekstra database, uden for produktionssystemet, hvor jeg vil gemme disse tal. Disse tal bør ikke ændre sig, dog med det lille "men" hvis jeg forespørger nu vil jeg få det antal der er kørt indtil nu, hvis jeg så forespørger igen til fyraften, vil jeg få et højere tal. Hvis jeg forstår korrekt, så vil det smarteste vel være at tjekke om datoens tal eksisterer, hvis ja skal de opdateres, hvis nej skal de oprettes.
Truncate funktionen kender jeg ikke, men som jeg læser det sletter den så hele tabelen ?
Synes godt om
Slettet bruger
08. september 2017 - 11:34#9
Ja, så kan du i dette tilfælde ikke bruge truncate da den sletter hele tabellen, og da du kun har 30 dages data, vil du efter 30 dage miste dine historiske data. Så den kan ikke bruges.
KAn der ligge flere tal på en dato? Eller findes der kun en dato med tal? Altså er datoen unik?
Synes godt om
Slettet bruger
08. september 2017 - 11:44#10
Hvis din dato altid er unik, så kan du evt prøve det her: Lig mærke til mine kommentarer --Først laver du en source table -- Skal kun bruges en gang --Ændre selv datatyperne til hvad de rent faktisk er SET ANSI_NULLS ON GO
---Indlæs data fra kilden til en source Tabel TRUNCATE TABLE dbo.SourceOpfyldning; --Vi tømmer Source Tabellen, da du altid bare vil have det seneste data.
INSERT INTO dbo.SourceOpfyldning (DelDate,SuppPaller) --Vi indæstter i vores SoruceTabel
---Her laver vi vores select mod kilden, altså det data vi ønsker at hente select O04T1.deldate, round(sum(O08T1.reqquant/L62T1.cquant),1) AS SuppPaller
from "SERVER_ZYX,58038".ZYX.dbo.O08T1, "SERVER_ZYX,58038".ZYX.dbo.L62T1, "SERVER_ZYX,58038".ZYX.dbo.O04T1 AS A Where O04T1.deldate > dateadd(day, -1, GETDATE()) and O04T1.deldate < dateadd(day, 0, GETDATE()) and
O08T1.shortl62 = L62T1.shortl62 AND O08T1.shorto04 = O04T1.shorto04 AND O04T1.r00key NOT LIKE ('DKRUS%') AND O04T1.r00key NOT LIKE ('ERROR') AND O04T1.r00key NOT LIKE ('DKC6%') AND O04T1.r00key NOT LIKE ('DKC8%') AND O04T1.r00key NOT LIKE ('DKC9%') AND O04T1.r00key NOT LIKE ('9%') AND L62T1.pmha IN ('40','60','62')
Group by O04T1.deldate;
-------------Hernæst skal vi indlæse vores Data i target som du skal bruge fremover - Dvs, vi nu læser historiske data ind. ---Fx Hvis DELDATE ikke matcher på både SOURCE og TARGET, så må vi gå ud fra rækken er ny og ikke findes, derfor skal den indsættes --Hvorimod hvis DELDATE matcher på BÅDe SOURCE og TARGET, ja så går vi ud fra vi har indlæst den før, men så vil vi gerne update den, med den værdi som findes i vores SOURCE.
MERGE [dbo].[Opfyldning] AS Target USING [dbo].[SourceOpfyldning] AS Source ON ISNULL(SOURCE.[DelDate],'') = ISNULL(TARGET.[DelDate],'') WHEN MATCHED AND ( ISNULL(SOURCE.[SuppPaller],'') <> ISNULL(TARGET.[SuppPaller],'')
Mine datoer er altid unikke. 1 dag eet antal paller.
Super hurtigt svar, mange tak. Jeg får det lige testet, så giver jeg en tilbagemelding.
Synes godt om
Slettet bruger
08. september 2017 - 12:30#12
Du kan også overveje at fjerne din order by i dit select statement og ligge et index på din tabel. Indexet er sortet og vil dermed sorterer dine data for dig. Det går hurtigere.
fx:
CREATE UNIQUE CLUSTERED INDEX [ClusteredIndex-20170908-122921] ON [dbo].[Opfyldning] ( [DelDate] DESC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) GO
TUSIND TAK for hjælpen plaidDK Der var lidt navne sammen fald, men det var hurtigt rettet og så virkede det helt efter hensigten.
Synes godt om
1 synes godt om dette
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.