conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS"

Tossi65

Benutzer
Beiträge
6
Hallo Kollegen,

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

Aber nun zum Thema. Eine StoredProcedure 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 collate database_default" 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
 
Werbung:
Das ist auf jeden Fall sehr umfangreich und nicht einfach zu überblicken wenn man nicht im Thema ist. Du musst das Problem für uns (und auch für dich) auf das wesentliche runter brechen. Hat der Code denn schon funktioniert oder ist der einfach nie fertig gemacht worden? Was hat sich seit dem verändert?

SELECT * kann man zum testen machen aber ist nicht schön in produktivem Code. Ebenso wenig eine temporäre Tabelle undefiniert zu erzeugen, genau das passiert ja wie du selbst erkannt hast. Je nachdem was du über den Parameter @MerkmalValues varchar(max) an die Funktion übergibst knallt es hier sofort oder später. Was steht in der Variablen?

Die Funktion split() ist mir nicht geläufig, auch meinem MSSQL 2014 nicht. In MSSQL gibt es string_split(), dort steht aber der Seperator hinter dem Wert. Um welchen MSSQL handelt es sich hier und was genau liefert split()?
 
Hallo ukulele,
da kann ich dir nur bei pflichten. Der Fehler soll jetzt erst bei einer Datenbank in den usa aufgetreten sein. Aber ich kann das nicht nachvollziiehen, da ich ihn hier auch auf dem Testserver
bekomme. Sobald ich die besagte StoredProcedure benutze knallt es mit der Fehlermeldung. Un die Message zeigt genau an die oben genannte Stelle zwischen den beider Anweisungen. Deshalb gehe
ich auch von der temp. Tabelle aus. Da die Spalten nicht manuell definiert sind werden diese glaube ich auf dem Datenbankstandard varchar erstellt und der weicht von der Tabelle ab.

Leider lässt sich bei einer befüllte Datenbank nicht so einfach die Collation umstellen, deshalb möchte ich den Weg über das "casten" der angesprochenen Spalten nehmen. Ich versuch mal die temp. Tabelle
selbst zu definieren und nicht vom System.

Falls Du noch einen Weg hast, immer her damit ;):D

Vielen Dank Torsten
 
Werbung:
Ich bin nicht sicher ob es die COLLATION ist, wie gesagt mir ist die Funktion split() nicht geläufig (finde die auch nicht im Netz, nur string_split()), die SQL Serverversion nicht bekannt und ich kenne den Wert nicht der an die Funktion übergeben wird. Vielleicht enthält der auch gar keinen Seperator, die Temp-Tabelle hat dann weniger Spalten (?) und deine SP bekommt nicht was sie erwartet.
 
Zurück
Oben