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
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