Jump to content

conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS"


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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 von Tossi65
Link zu diesem Kommentar

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

 

Link zu diesem Kommentar

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

 

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...