Tossi65 1 Geschrieben 14. Februar 2020 Melden Teilen Geschrieben 14. Februar 2020 (bearbeitet) 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 bearbeitet 14. Februar 2020 von Tossi65 Zitieren Link zu diesem Kommentar
NilsK 2.918 Geschrieben 14. Februar 2020 Melden Teilen Geschrieben 14. Februar 2020 Moin, ich sehe viel Code und wenig Frage ... könntest du das Problem noch mal zusammenfassen? Zitat Aber was ist SplittedValues??? Ich habe keine Declaration einer temp. Tabelle gesehen?? Abgesehen von der seltsamen Vergangenheitsform "Splitted" braucht es hier keine Tabellendefinition, weil die Anweisung SELECT INTO immer eine neue Tabelle erzeugt, deren Definition sich aus der Definition der Ausgangsdaten ergibt. https://docs.microsoft.com/de-de/sql/t-sql/queries/select-into-clause-transact-sql?view=sql-server-ver15 Gruß, Nils Zitieren Link zu diesem Kommentar
Tossi65 1 Geschrieben 14. Februar 2020 Autor Melden Teilen Geschrieben 14. Februar 2020 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 Zitieren Link zu diesem Kommentar
NilsK 2.918 Geschrieben 14. Februar 2020 Melden Teilen Geschrieben 14. Februar 2020 Moin, da wäre jetzt die Frage, auf welchen der Vorschläge in dem Thread du dich beziehst ... aber kurz gesagt: Nein, ich habe mangels konkreter Erfahrung mit diesem Szenario keinen anderen Vorschlag. Gruß, Nils Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.