Jump to content

MDD

Members
  • Gesamte Inhalte

    168
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von MDD

  1. Hallo.

    Ganz verstehe ich das Anliegen nicht. Für mich fehlen die Rahmbedingungen.

    Kannst du von einer Datenbank direkt auf die andere zugreifen? 

    Was ist der Zweck des Datenabgleichs? Von wo nach wo gehen Daten?

    Transportierst du 1 Record von A nach B oder checkst du ob sich einzelne Werte in einem Record geändert haben und übergibst nur diese?

     

    Eindeutige Indexe und Primary Key sind generell ja nicht das selbe. Eindeutige Indexe kannst du ja viele haben, unabhängig wie sie aufgebaut sind.

    Gruß MDD

  2. Trotz Crossposting .... der vollständigkeitshalber trag ich es hier auch noch ein. 

     

    Überprüf mal was bei dir der erste Tag der Woche ist 

     

    select @@datefirst

     

    Wenn das 1 sein sollte dann passt es nicht mit dem Kalender zusammen und du müsstest fürs Wochenende 6 und 7 ausnehmen statt 1 und 7.

     

    Werde hier aber nicht mehr zu diesem Thema weiter schreiben. 

     

     

  3. Ich habs trotzdem nochmal versucht

    /* create table #abwesend (mitarbeiter varchar(10), unterbrechungsgrund varchar(10), datum date)
    insert into #abwesend
    values
    ('Huber','Urlaub','20230317'),
    ('Huber','Urlaub','20230318'),
    ('Huber','Urlaub','20230403'),
    ('Huber','Urlaub','20230404'),
    ('Maier','krank','20230317'),
    ('Maier','Urlaub','20230318'),
    ('Müller','krank','20230317'),
    ('Müller','Urlaub','20230525'),
    ('Müller','Urlaub','20230526')
    */
    
    DECLARE @StartDate DATE = '20230317';
    DECLARE @CutoffDate DATE = DATEADD(DAY, - 1, DATEADD(YEAR, 1, @StartDate));;
    
    WITH seq (n)
    AS (
    	SELECT 0
    	
    	UNION ALL
    	
    	SELECT n + 1
    	FROM seq
    	WHERE n < DATEDIFF(DAY, @StartDate, @CutoffDate)
    	)
    	,d (d) -- Kalender ohne Wochenende
    AS (
    	SELECT DATEADD(DAY, n, @StartDate)
    	FROM seq
    	)
    	,kalender (
    	d
    	,mitarbeiter
    	)
    AS (
    	SELECT d
    		,mitarbeiter
    	FROM d
    	CROSS JOIN (
    		SELECT DISTINCT mitarbeiter
    		FROM #abwesend
    		) AS x where DATEPART(WEEKDAY,d) not in (1,7)  -- für Wochenende keinen Tag in der Tabelle erzeugen
    	)
    	,letzttag (	mitarbeiter	,d)--Tabelle mit Erster Arbeitstag
    AS
    	(
    	SELECT KALENDER.mitarbeiter
    		,MIN(d)
    	FROM KALENDER
    	LEFT JOIN #abwesend a ON a.datum = d
    		AND kalender.mitarbeiter = a.mitarbeiter
    	WHERE datum IS NULL
    	GROUP BY KALENDER.mitarbeiter
    	)
    SELECT *
    FROM #abwesend
    WHERE EXISTS (
    		SELECT MAX(datum) maxdat
    			,ab.mitarbeiter
    		FROM #abwesend ab
    		JOIN letzttag ON letzttag.mitarbeiter = #abwesend.mitarbeiter
    		WHERE datum < d
    		GROUP BY ab.mitarbeiter
    		HAVING ab.mitarbeiter = #abwesend.mitarbeiter
    			AND MAX(datum) = #abwesend.datum
    		)
    OPTION (MAXRECURSION 0)

     

    Der erste Teil erzeugt einen Kalender (für 1 Jahr) ohne Wochenende, Da könnte man auch auf das höchste Datum +1 Tag der Abwesenheitstabelle gehen.

    Was klar nicht abgedeckt ist sind die Feiertage.

    Dann hol ich mir das erste Datum wenn die Leute wieder da sind und dann aufgrund dessen wieder das letzte an dem sie gefehlt haben mitsamt dem Grund.

    Verknüpft habe ich über die Mitarbeiternamen, da gibts sicher auch was eindeutiges. aber als Idee sollte es reichen.

     

     

  4. Also aufgrund der Daten alleine fällt mir auf die Schnelle kein Weg ein.

    Wenn du aber eine zweite Tabelle hast wo alle Arbeitstage drinnen sind, und ich bin fast überzeugt dass du die brauchst wegen der Feiertage und Wochenenden,  dann könntest die geplanten Abwesenheiten von der Tabelle abziehen und den nächsten Arbeitstag ausgeben.

     

  5. Nur noch so als Hinweis:

    Du kannst im SSMS im Fenster Registered Servers eine Server Gruppe mit allen 12 Servern mit den Verbindungsdaten einmalig hinterlegen.

    Wenn du nachher auf die Servergruppe gehst und über das Kontextmenü eine Neue Abfrage öffnest, wird ein neues Abfragefenster mit Verbindung zu allen Servern geöffnet.

    Dann kannst per Script auf allen Servern gleichzeitig mit einer Aktion den User anlegen und überall gleich berechtigen.

    Vereinfacht oft manche Kontrollen und Aufgaben.

     

  6. vor 52 Minuten schrieb Tossi65:

    Ich erstelle das Programm mit meinem Account und habe Zugriff als Admin auf den SQL Server. Der User des des Programmes soll diese Berechtigung natürlich nicht haben.

     

     

    Wenn du als Admin ein Programm erstellst hast du auf dem SQL-Server die Berechtigungen die du als Admin dort eben hast. Wenn ein Otto-Normal-Benutzer das Programm startet und die Windows Authentifizierung verwendet wird er dort auch als Benutzer "Otto-Normal" verbunden und hat dann auch die entsprechenden Rechte. 

    Vielleicht sehe ich das Problem noch nicht.

    Solange du nicht deine Verbindungsdaten im Programm mitspeicherst wird der aktuelle Windowsbenutzer durchgereicht. Unabhängig in welchem Kontext das Programm erstellt wurde.

     

    Schwieriger erscheint es öfter als Admin das zu sehen was der Benutzer sieht. 

  7. Sorry Habs überlesen

    Um dich mit einem andren Useraccount anzumelden müsstest ja ein Impersonating machen. 

    Sonst kannst nicht einfach einen den Sicherheitskontext eines anderen Benutzers übernehmen.

    Allerdings wäre es möglich mit einem SQL User zu arbeiten.

     

     

    Warum willst du das so machen?

  8. Hallo

    Mit deiner Abfrage bekommst du für jeden Eintrag in deiner Tabelle die Spalte Monat zurück.

    Wenn da mehrfach der gleiche Monat drinnen ist und die willst das es gesammelt ausgegeben wird musst du eine Gruppierung verwenden.

    Mit dem Stichwort "Group by" solltest du bei der Recherche fündig werden.

    Gruß MDD

     

    Korrektur:

    Ich hab das nicht aufmerksam genug gelesen, sorry. Deine SQL-Abfrage passt nicht zu deiner Frage.

    Du hast das nur eine halbe Abfrage und eigentlich ist nicht klar was du genau erreichen willst. 

    Dein Case bezieht sich nicht auf den Monat sondern auf die Spalte "Task".

    Daher ist unklar was du genau zu erreichen suchst.

     

     

     

  9. Hallo

    du machst die Sortierung an der falschen Stelle.

    Die muss ganz zum Schluss kommen. Durch den letzten Join werden die Daten wieder über den Haufen geworfen.

    Hallo

    du machst die Sortierung an der falschen Stelle.

    Die muss ganz zum Schluss kommen. Durch den letzten Join werden die Daten wieder über den Haufen geworfen.

    Performancemäßig ist sowas vielleicht sogar kontraproduktiv da die Sortierung sicher nicht dem join Kriterium entspricht und der dann extra nochmal umsortiert werden muss um es zu verknüpfen 

    Gruß mdd

  10. Amen ;-)

    Mir ist noch eine kleine Verbesserung eingefallen die sicher auch performanter ist:

     

    SELECT BLANKET_ORDER_GUID
    FROM vi_RA AS A
    	WHERE NOT EXISTS 
    	(
    		SELECT sum(wert) FROM vi_ra AS b
          		where  a.BLANKET_ORDER_GUID = b.BLANKET_ORDER_GUID
    			group by b.BLANKET_ORDER_GUID
    			having sum(wert) > 5000 or min(marge) < 10
    	) 

     

  11. SELECT BLANKET_ORDER_GUID
    FROM vi_RA AS A
    	WHERE NOT EXISTS
    	(
        	SELECT 'x' FROM vi_ra AS b
    			WHERE a.BLANKET_ORDER_GUID   =  b.BLANKET_ORDER_GUID AND b.marge < 10
        )
        AND NOT EXISTS 
    	(
    		SELECT summe(wert) FROM vi_ra AS c
          		where  a.BLANKET_ORDER_GUID   =  c.BLANKET_ORDER_GUID
    			group by c.BLANKET_ORDER_GUID
    			having (summe(wert) > 5000
    	) 

        
    Das sollte dir die Guid RA2022202726 zurück liefern aber nicht RA2022202729 oder RA2022202728.

     

     

  12. SELECT BLANKET_ORDER_GUID
    FROM Tabelle AS A
    WHERE NOT EXISTS (
            SELECT 'x'
            FROM Tabelle AS b
            WHERE a.BLANKET_ORDER_GUID   = b.BLANKET_ORDER_GUID
                AND (
                    b.wert > 5000
                    OR b.marge > 10
                    )
            )

     

    Sowas in der Art?

    Je nachdem on du jetzt die GUID von den Aufträge brauchst die gegen die Regeln verstoßen oder die die nicht dagegen verstoßen musst halt das NOT vor dem EXISTS weglassen.

  13. Hallo 

    Auf dem ersten Bild schaut die erste Auswahl so aus als würde auch im Erfolgsfall eine Meldung ausgeführt werden. 

     

    Kann es sein dass der Vorgang in Wirklichkeit fehl schlägt?

    Bei mir ist das Thema Clustering (auch mit anderer SQL Version) schon ne Weile her, dennoch würde ich nicht wundern wenn du auf Fehler läufst wenn du Transaktionslogs abschneiden willst solange du Clustermäßig unterwegs bist.

    Normalerweise müsstest du ja sehen ob im SQL-Log bzw. bei deiner Nachricht auch wirklich ne Fehlermeldung dran hängt. Dann tutet es ja richtig. 

     

    Rein technisch gesehen würde ich immer alle Ergebnisse in eine Datenbank protokollieren und diese regelmäßig abfragen. Das Ergebnis kann dann in einem Monitoring dargestellt werden, ausgewertet und kontrolliert werden. 

    Oftmals funktioniert im Fehlerfall die Infokette auch nicht mehr. Es reicht wenn die Empfängeradresse sich ändert oder was mit dem Agent nicht passt.

     

    Gruß MDD

  14. Normalerweise arbeitet der SQL auf Port 1433.

    Wenn du Instanzen verwendest kann das unter Umständen auch ein anderer Port sein und dein Client erreicht möglicherweise niemanden unter dieser "Durchwahl"

    Im Konfiguration Manager siehst du unter welcher Portnummer die Instanz erreichbar ist. 

    Auch die Firewall muss auf diesem Port die Kommunikation durchlassen.

    Daher Stichwort -

    SQL Server Konfiguration Manager https://docs.microsoft.com/en-us/sql/relational-databases/sql-server-configuration-manager?view=sql-server-ver15

    SQL Browser - https://docs.microsoft.com/en-us/sql/tools/configuration-manager/sql-server-browser-service?view=sql-server-ver15

    und Firewall

    Du kannst mal versuchen ob du den SQL lokal über Port 1433 erreichst.

    Gruß MDD

     

×
×
  • Neu erstellen...