Avatar billede Alladin Juniormester
06. september 2017 - 09:40 Der 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.


insert into opfyldning (Levdato, Supp_paller)

select
O04T1.deldate, round(sum(O08T1.reqquant/L62T1.cquant),1) 'supp.paller'

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
Avatar billede Slettet bruger
06. september 2017 - 11:28 #1
CREATE PROCEDURE dbo.opfyldning
as

insert into opfyldning (Levdato, Supp_paller)

select
O04T1.deldate, round(sum(O08T1.reqquant/L62T1.cquant),1) 'supp.paller'

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
Avatar billede 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.
Avatar billede Alladin Juniormester
06. september 2017 - 14:07 #3
Man kan nogle gange få grå hår, af et enkelt komma der skal flyttes.
Jeg har været meget tæt på selv.
plaidDK dit forslag virker perfekt.

TAK
Avatar billede Alladin Juniormester
08. september 2017 - 08:27 #4
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.
Avatar billede Alladin Juniormester
08. september 2017 - 08:32 #5
Æ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.
Avatar billede 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)

Noget ala:

CREATE PROCEDURE dbo.opfyldning
as

insert into opfyldning (Levdato, Supp_paller)

select
O04T1.deldate, round(sum(O08T1.reqquant/L62T1.cquant),1) 'supp.paller'

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
Avatar billede 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 :)
Avatar billede Alladin Juniormester
08. september 2017 - 10:30 #8
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 ?
Avatar billede 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?
Avatar billede 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

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[SourceOpfyldning](
    [DelDate] [date] NULL,
    [SuppPaller] [numeric](18,2) NULL
) ON [PRIMARY]

GO

---Og en target tabel -- Altså hvor i dine slutdata skal lande i
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Opfyldning](
    [DelDate] [date] NULL,
    [SuppPaller] [numeric](18,2) NULL
) ON [PRIMARY]

GO

-----

---Så laver vi en Stored PRocedure

CREATE PROCEDURE dbo.sp_Opfyldning AS


---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],'')

)
THEN UPDATE SET
         
          [SuppPaller] = SOURCE.[SuppPaller]
     

WHEN NOT MATCHED THEN
INSERT (

            [DelDate]
            ,[SuppPaller]

)
VALUES (
          SOURCE.[DelDate]
          ,SOURCE.[SuppPaller]
       
      )
;
Avatar billede Alladin Juniormester
08. september 2017 - 12:15 #11
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.
Avatar billede 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
Avatar billede Alladin Juniormester
08. september 2017 - 14:00 #13
TUSIND TAK for hjælpen plaidDK
Der var lidt navne sammen fald, men det var hurtigt rettet og så virkede det helt efter hensigten.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester