Jump to content

Tossi65

Members
  • Gesamte Inhalte

    53
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von Tossi65

  1. Guten Morgen,

    ich habe eine Frage zu einer MS SQL Datenbank. Ich persönlich komme aus dem Interbase / Firebird Umfeld. Unsere Datenbanken sind alle MS Sql basierend. Sie werden schon über Jahre betrieben. Sie sind indiziert, zwar mit Indezes aus mehreren Feldern davon halte ich gar nichts, aber sie haben Indezes. Unsere Kollegen beschweren sich aber immer mehr, dass Wartezeiten auf Daten aus der Datenbank teilweise lange dauert. Ich kann keine Fehler in der Datenbank entdecken. Im "Activity Monitor" sehe ich aber SQL Statements, meistens Updates bzw. Inserts, die bis zu 4 Sekunden dauern.

     

    Eine Firebird Datenbank würde man bei diesen Symptomen mit einen BackUp / Restore wieder reorganisieren, wegen den internen Transaktionsketten.

     

    Geht dies auch mit SQL Datenbanken? Welche Möglichkeiten habe ich hier?

     

    Ich muss mich auf MS SQL Datenbanken einarbeiten.

     

    Danke für Eure Hilfe.

    Torsten

  2. Guten Morgen,

     

    ich arbeite mich tiefer in TSQL ein und betreue eine MS SQL Datenbank. Darin befindet sich eine gespeicherte Prozedur, die ich nicht ganz verstehe.

    Dabei brauche ich eure Unterstützung.

     

    ALTER PROCEDURE [dbo].[usp_PTrackDocumentsGetPending]
    as
    	;with existing_docs(doc_type, doc_num, doc_ver)
    	as
    	(
    		select doc_type, doc_num, doc_ver
    		from ORD_Documents
    	)
    
    	select 
    		pt_ord_num = substring(ord_num, 5, 12)
    		, mat_num = substring(z.mat_num,11,18)
    		, Z.doc_type, Z.doc_num, Z.doc_ver--, z.docnum
    		, upload = (case when ed.doc_num is null then 1 else 0 end)
    	FROM ORD_Order_Header AS H
    	join XFR_Z1docum AS Z
    		on z.docnum = h.docnum
    		and z.hasDocument = 1
    	left outer join existing_docs ed
    		on ed.doc_type = z.doc_type
    		and ed.doc_num = z.doc_num
    		and ed.doc_ver = z.doc_ver
    	where h.crt_dt >= getdate()-7
    	order by pt_ord_num desc
    	--and ed.doc_num is null
    

     

     

    Was bewirkt die ";with " Anweisung? Im meinem SQL Server Buch steht natürlich darüber nichts.

     

    Danke für Eure Unterstützung.

  3. Hallo Kollegen,

    ich verliere gleich den Verstand. Ich habe eine Tabelle erstellt mit einer DateTimspalte. Aus dem Programm füge ich per Insert ein Datum ein

    cmd.Parameters.AddWithValue("@datum", DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));

    In der Tabelle steht dann:

    image.png.c65e1e5cc31f65b1e1ddebb3d58be6aa.png

     

    WArum sind Mnnat und Tag vertauscht??? Bei dem SQL Statement ist alles richtig "2021-06-10 ..."

     

    Mfg Torsten

     

  4. Guten Morgen,

     

    Ich möchte unserem Supporter und dem KeyUser an der Linie HIlfsmittel an die Hand geben, um das Problem schnellst möglich zu beheben.

    Dazu gehört auch eine Abbildung der Situation auf dem SQL Server. Diese Leute haben nicht die Berechtigung für die Server. Die Supporter

    kommen teilweise nicht mal aus unserer Firma. Wenn sie den Fehler nicht beheben können sollen sie den nächsten Level des Supports anrufen.

     

    Gruß Tossi

  5. Nein.  DIe Linie besteht aus einem MasterPC und mehreren Clients. Alle PC's haben eine Datenbankverbindung. All das kann ich auch im Monitor vom dem SQL Management Studio sehen, aber eben auch alles andere. Ich möchte diesen Monitor mit den MMO nachbauen, wenn es geht und nur auf diese Datenbank für die Linie beschränken.

     

    HIntergrund:

    Es kommt hin und wieder vor, das eine SQL Abfrage, welche alltäglich läuft, einfach hängen bleibt. Das Herunterfahren aller Linien PC's für den Neustart hilft nichts. Es muss dann eben der SQL Prozess für diese Abfrage gekillt werden. Warum diese Abfrage auf einmal hängen bleibt haben wir noch nicht herausgefunden.

     

    Gruß Torsten

  6. Hallo NilsK,

    c# ist meine favorisierte Programmiersprache bei diesem Projekt. Und es geht am schnellsten. Denke ich. Ziel ist es eine Anzeige zu bekommen von dem Datenbankserver für eine bestimmte Datenbank(LinienDB) und damit verbundene Clients. Wie gesagt es soll dem Support dienen.

    Gruß Tossi 

  7. Guten Morgen Leute,

     

    hat jemand von Euch schon ein Programm mit .Net(c#) zum überwachen eine SQL Servers erstellt?

    Ich stelle mir das so vor:

    Wir haben einen MasterPC auf dem eine Anwendung läuft. Diese Anwendung benötigt eine Datenbank auf einem MS SQL Server.  Ich möchte ein Formular erstellen, welche die Aktivitäten auf dieser Datenbank anzeigen.

    Hintergrund: es kommt hin und wieder vor, das ein Prozess(select...) eines Clients hängen bleibt und somit den Neustart dieser verteilten Anwendung erheblich stört.

     

    Ich will das ganze nur als Information anzeigen und zu Supportzwecke nutzen.

     

    Mfg Tossi

     

     

     

  8. Hallo Nils,

    das Problem ist folgendes:

    Die genannte Prozedur löst auf einer Datenbank beim Kunden in den USA folgenden Fehler aus:

     

    Msg 468, Level 16, State 9, Procedure getDeviceTypeFromSAPWithID, Line 47
    Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation.

     

    Ich habe nach dem Fehler geforscht und richtig: Die Datenbank Collation und Tabellenspalten Collation weichen voneinander ab.

    Da wir die Datenbank erst dieses Jahr wirklich aktiv nutzen, ist das vorher nicht aufgefallen. Trotzdem sind schon Daten in der Datenbank,

    welche wir nicht verlieren dürfen.

     

    Also die Tabellenspalten lassen sich nachträglich nicht so einfach auf eine neue Collation umsetzen. Datenbank meckert. Aber laut

    Stack Overflow kann man das auch anders lösen:

    https://stackoverflow.com/questions/1607560/cannot-resolve-the-collation-conflict-between-sql-latin1-general-cp1-ci-as-and

     

    ALso wollte ich laut Anweisung vorgehen. Aber es scheint nicht zu gehen.

     

    Oder siehst Du eine andere Lösung.

     

    Danke Torsten

     

  9. Hallo Kollegen,

    ich habe die Aufgaben von meinem verstorbenen Kopllegen übernommen. Ich bin leider noch kein MS SQL Profi. Ich habe meine Ausbildung auf andere Datenbanken gemacht.

    Aber nun zum Thema. Eine StoreProcedur erzeugt oben genannten Fehler und das stimmt auch. Die Database defaut Collation ist SQL_Latin1_General_CP1_CI_AS benutz wurde in einigen Tabellen

    Latin1_General_CP1_CI_AS. Tja und nun auf einmal wird der obige Fehler bei gebrauch der Prozedur ausgelöst. Einen Workaround habe ich gefunden und würde diesen auch anwenden. Aber SQL ManagementStudio

    kann irgendwie die Zeilen nicht richtig Zählen.

     

    USE [DB]
    GO
    
    /****** Object:  StoredProcedure [dbo].[getDeviceTypeFromSAPWithID]    Script Date: 2/14/2020 11:44:58 AM ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER PROCEDURE [dbo].[getDeviceTypeFromSAPWithID] 
    (
    	-- Add the parameters for the function here
        @myreturn smallint OUTPUT ,
        @myreturntext varchar(255) output,
        @DeviceType_Bez varchar(64) output,
        @DeviceType_id smallint output,
    	@SAPDeviceType_bez varchar(64),
    	@SAPDeviceType_id smallint output,
    	@MerkmalValues varchar(max),
    	@TestSystemLocation_bez varchar(32) 
    )
    AS
    BEGIN
        DECLARE @l_cnt int,
    			@l_cnt2 int,
    			@l_cnt3 int,
    			@l_cnttmp int,
                @l_TestSystemLocationDummy_bez varchar(32);
    
    	SET @myreturn = 0
    	SET @myreturntext = N'NoError'
    
    	BEGIN TRY
    
    
    	-- SAPDeviceTypeID bestimmen
    	SET @SAPDeviceType_id = (SELECT SAPDeviceType_id FROM p_SAPDeviceType WHERE SAPDeviceType_Bez = @SAPDeviceType_bez)
    
    	-- Auftrennen der Zeichenkette mit den Bedingungen in Key/Value Paare nach #SplittedValues
    	SELECT * INTO #SplittedValues FROM Split(';', @MerkmalValues) 
    
    -- Hier knallt es
    
    	-- Temporäre Tabelle für die Ergebnisse der einzelnen Vergleiche
    	CREATE TABLE #tmpDeviceType ( sSAPDeviceType_bez varchar(64)
    								, SAPDeviceType_id smallint
    							    , sDeviceType_bez varchar(64)
    								, DeviceType_id smallint
    							    )
    
    	-- Selektieren von SAPDeviceType nach DeviceType Mappings welche den Key/Value Bedingungen entsprechen
    	INSERT INTO #tmpDeviceType (sSAPDeviceType_bez, SAPDeviceType_id, sDeviceType_Bez, DeviceType_id)
    		SELECT p_SAPDeviceType.SAPDeviceType_bez, p_SAPDeviceType.SAPDeviceType_id
    		     , p_DeviceType.DeviceType_bez, p_DeviceType.DeviceType_id 
    			FROM p_SAPDeviceType_Location INNER JOIN
    				 p_SAPDeviceType ON p_SAPDeviceType_Location.SAPDeviceType_id = p_SAPDeviceType.SAPDeviceType_id INNER JOIN
    				 p_DeviceType ON p_SAPDeviceType_location.DeviceType_id = p_DeviceType.DeviceType_id INNER JOIN
    				 p_TestSystemLocation on p_SAPDeviceType_Location.TestSystemLocation_id = p_TestSystemLocation.TestSystemLocation_id INNER JOIN
    				 p_SAPMerkmal on p_SAPDeviceType_Location.Merkmal_id = p_SAPMerkmal.merkmal_id INNER JOIN
    				 p_SAPMerkmalWert on p_SAPDeviceType_Location.Merkmalwert_id = p_SAPMerkmalWert.merkmalwert_id INNER JOIN
    				 #SplittedValues on p_SAPMerkmal.merkmal_bez = #SplittedValues.[key] AND p_SAPMerkmalWert.merkmalwert_bez = #SplittedValues.value 
    			WHERE p_TestSystemLocation.TestSystemLocation_bez collate database_default = @TestSystemLocation_bez
    			  AND p_SAPDeviceType.SAPDeviceType_bez collate database_default = @SAPDeviceType_bez
    			  AND p_SAPDeviceType_Location.[enabled] = 1
    		  		    
    	-- Wenn keine Einträge für TestSystemLocation gefunden, dann mit Default Location ID = 0 (MASTER - GER) probieren
    
    	SET @l_cnttmp = (SELECT COUNT(*) FROM #tmpDeviceType) 
    
        IF @l_cnttmp = 0
        BEGIN
            SET @l_TestSystemLocationDummy_bez =
               (SELECT TestSystemLocation_bez FROM p_TestSystemLocation WHERE TestSystemLocation_id = 0)
    
    		INSERT INTO #tmpDeviceType (SAPDeviceType_bez, SAPDeviceType_id, DeviceType_Bez, DeviceType_id) 
    			SELECT p_SAPDeviceType.SAPDeviceType_bez, p_SAPDeviceType.SAPDeviceType_id
    			     , p_DeviceType.DeviceType_bez, p_DeviceType.DeviceType_id 
    				FROM p_SAPDeviceType_Location INNER JOIN
    					 p_SAPDeviceType ON p_SAPDeviceType_Location.SAPDeviceType_id = p_SAPDeviceType.SAPDeviceType_id INNER JOIN
    					 p_DeviceType ON p_SAPDeviceType_location.DeviceType_id = p_DeviceType.DeviceType_id INNER JOIN
    					 p_TestSystemLocation on p_SAPDeviceType_Location.TestSystemLocation_id = p_TestSystemLocation.TestSystemLocation_id INNER JOIN
    					 p_SAPMerkmal on p_SAPDeviceType_Location.Merkmal_id = p_SAPMerkmal.merkmal_id INNER JOIN
    					 p_SAPMerkmalWert on p_SAPDeviceType_Location.Merkmalwert_id = p_SAPMerkmalWert.merkmalwert_id INNER JOIN
    					 #SplittedValues on p_SAPMerkmal.merkmal_bez = #SplittedValues.[key] AND p_SAPMerkmalWert.merkmalwert_bez = #SplittedValues.value 
    				WHERE p_TestSystemLocation.TestSystemLocation_bez = @l_TestSystemLocationDummy_bez
    				  AND p_SAPDeviceType.SAPDeviceType_bez = @SAPDeviceType_bez
    				  AND p_SAPDeviceType_Location.[enabled] = 1
    	END
    		
    
    	-- Anzahl der übergebenen Merkmalskombinationen bestimmen
    
    	SET @l_cnt = (SELECT COUNT(*) FROM #SplittedValues) 
    	
    	SELECT SAPDeviceType_bez, SAPDeviceType_id, DeviceType_bez, DeviceType_id, COUNT(*) AS [count] INTO #tmpCnt FROM #tmpDeviceType
    		GROUP BY SAPDeviceType_bez, SAPDeviceType_id, DeviceType_bez, DeviceType_id
    
    	SET @l_cnt2 = (SELECT MAX([count]) FROM #tmpCnt)
    
    	IF @l_cnt2 < @l_cnt
    	BEGIN
    		SET @DeviceType_bez = '-'
    		SET @DeviceType_id = -1
    	END
    	ELSE
    	BEGIN
    		IF @l_cnt2 > @l_cnt
    		BEGIN
    			SET @DeviceType_Bez = '+'
    			SET @DeviceType_id = -1
    		END
    		ELSE
    		BEGIN
    			-- Es gibt zumindest einen DeviceTyp, der genau die angegebenen Bedingungen erfüllt
    
    			SET @l_cnt3 = (SELECT COUNT(*) FROM #tmpCnt WHERE [count] = @l_cnt2)
    
    			IF @l_cnt3 > 1
    			BEGIN
    				SET @DeviceType_Bez = '+'
    				SET @DeviceType_id = -1
    			END
    			ELSE
    			BEGIN
    				SET @DeviceType_Bez = (SELECT DeviceType_Bez FROM #tmpCnt WHERE [count] = @l_cnt)
    				SET @DeviceType_id = (SELECT DeviceType_id FROM #tmpCnt WHERE [count] = @l_cnt)
    			END
    		END
    	END
    
    	DROP TABLE #tmpDeviceType
    	DROP TABLE #tmpCnt
    
    	END TRY
    	
    	BEGIN CATCH
    	
    		SET @myreturn = (SELECT ERROR_NUMBER())
    		SET @myreturntext = (SELECT ERROR_MESSAGE())
    		
    	END CATCH
    
    END
    
    
    
    
    
    GO
    
    

    Dort wo "--Hier knallt es" ist die besagte Stelle.

    Ich habe der temporären Tabelle bei den varchar Spalten ein "collate database_default" angefügt. Hat nichts gebracht.

    Das Selbe habe ich bei "where Feldname collate database_default= bla" gemacht. Auch kein Erfolg.

     

     

    Die Zeile mit dem Fehler bleibt und stehet immer noch zwischen den Anweisungen. Da ist mir folgendes aufgefallen:

    SELECT * INTO #SplittedValues FROM Split(';', @MerkmalValues)

    Markvalues wird per Eingansparameter übergeben in SplittedValues mit Split(...) aufgeteilt. OK!

    Aber was ist SplittedValues??? Ich habe keine Declaration einer temp. Tabelle gesehen??

    Kann hier der Fehler passieren?

     

     

    Vielen Dank Torsten

  10. Guten Morgen wi-ra,

    das Problemm wird immer bizzarer. Die eine Replikation, welche vorher gestört war, ist nun grün und keine Fehler. Aber es werden keine Daten übermittelt.

     

    Bei sder 2. Replikation, welche einen Fehler mit einem schon vorhandenen Eintrag in einer Tabelle meldet, zeigt auf 2. Tabellen.

    Im Fehlertext vom Agenten steht Tabelle a. Werte ich die Transaktion mit dem Command ID aus, wird dort eine andere Tabelle genannt.

     

    Wie soll man da richtig vorgehen???

     

    Mfg Torsten

  11. Ja das hast du richtig verstanden. Die Resultate werden in einer Datenbank zusammengeführt. Die Tabellen sind überall gleich nur die Datenmenge ist durch where ... unterschiedlich und werden übertragen. Fakt ist das eine Tabelle der Meinung ist, das der neue Eintrag schon vorhanden ist. Jetzt möchte ich diesen Eintrag für diese Datenmenge ermitteln und aus den Commands deaktivieren. Wenn es geht?!

    ,

     

  12. Hallo wi-ra,

     

    da wir die Datenbanken von den Standorten zu uns replizieren, sind diese unterschiedlich groß. Im Schnit ca 200 bis 500 MB. Aber sie werden alle gemeinsam in eine Zieldatenbank repliziert und die hat schon ca 1,5 GB.

     

    Mich interessiert meht die distributio n DB. So wie ich es gelesen haben stehen dort die Commans drin. Wie und wo kann ich da eingreifen????

    Die Beschreibung im Internet sind alle nicht so recht zielführend. Den Command über Transaction und CommandID zu identifizieren hat zu verschiedenen Ergenbnissen geführt.

    Als Ursache wurden 2 verschiedene Tabellen genannt.

     

    Mfg Torsten

  13. Hallo DerFrank,

    ich habe den Eintrag in der Tabelle gefunden, zielseitig. Leider kann ich diesen Eintrag nicht löschen, da er Abhängigkeiten zu anderen Einträgen hat. Mist.

     

    Wie und Wo kann ich den Befehl(Command) finden, damit ich diesen Inaktiv oder so setzen kann??? In MySQl setzt man einfach die Abarbeitung auf die nächste Sequenznummer(Step)

    Wie geht das bei MS SQL????

     

    Noch komischer ist der Umstand, das in der Fehlermeldung einen andere Tabelle genannt wird als in dem betreffenden Command?? Alles etwas verwirrend, Aber es muss doch gehen.

    Die Kollegen sind schon sauer weil die Replikation seit Wochen nicht richtig läuft.

     

     

  14. Hallo MDD,

    wenn ich wüsste welchen Datensatz die Replikation in der Zieltabelle einfügen will, dann kann ich auch eingreifen. Der Key liegt bei der Tabelle auf dem Feld ID und diese Werte sind natürlich schon drin.

    Seit dem Jahr 2012! Microsoft scheint hier wieder einen nicht aussagekräftige Meldung auszugeben. Kann man die  letzte übetragende ID der Quelle ermitteln???

     

    Mdg Torsten

×
×
  • Neu erstellen...