4

Ich übertrage Datenbank von SQL Server 2000 auf SQL Server 2008 R2 SP2 und alles funktioniert gut bis auf eine gespeicherte Prozedur. Der Fehler tritt in dem folgenden Code:Stored Procedure funktioniert auf SQL Server 2000, aber nicht auf SQL Server 2008R2

declare @Dates table (
    ForDate smalldatetime, 
    DayStart int, 
    PRIMARY KEY CLUSTERED (ForDate) 
) 

INSERT INTO @Dates 
    SELECT M.ForDate 
    FROM @Master M 
    GROUP BY M.ForDate 

Der Fehler ist:

Msg 213, Ebene 16, Status 1, Prozedur REP_Media, Linie 115
Spaltenname oder Anzahl der übergebenen Werte stimmt nicht mit der Tabellendefinition überein.

Ich erkannte, dass der Fehler auftritt, weil es keinen Wert für die Spalte DayStart in der @Dates Tabelle Größe zugeführt wird. Ich kann NULL in innere Auswahl hinzufügen und alles funktioniert gut.

Aber das gleiche Verfahren funktioniert auf SQL Server 2000 und nicht auf SQL Server 2008 R2 SP2, warum? Was sollte für den normalen Betrieb ohne Änderung der Prozedur (einige Serveroptionen oder andere Lösung) getan werden?

Ich versuche, SET ANSI_NULL_DFLT_ON ON in Prozedurdefinition und in Datenbankoptionen zu verwenden, aber ohne Erfolg.

+2

Nun, das ist einfach eine schlechte Übung, solche Anweisungen zu schreiben. Sie sollten immer die Spaltenliste angeben, wenn Sie eine Insert-Anweisung schreiben. –

+0

Leider ist dies nicht mein Code, und solche Anforderungen können an anderer Stelle in der Anwendung auftreten, die die Datenbank verwendet. – Sergey

Antwort

3

Es gibt nichts, was Sie tun können, abgesehen von der Aktualisierung der SQL.

SQL Server in den letzten Versionen können Sie einfach keine insert...select mit weniger Elementen in der SELECT Liste als in der Spaltenliste tun. Sie haben keine explizite Spaltenliste, so dass alle Spalten mit Ausnahme von Identität, Zeitstempel und berechnet berücksichtigt werden.

I.e. (ForDate, DayStart)

Auch wenn DayStart ist nullable Sie noch eine explizite Spaltenliste in der Reihenfolge von Ihrer einzigen Spalte, angewandt verwenden müssen, würden die Syntax ändern

SELECT Quelle zu erhalten
INSERT INTO @Dates (ForDate) 
SELECT M.ForDate 
FROM @Master M 
GROUP BY M.ForDate 

Dies scheint ein change in behaviour zu sein von SQL Server 2000 (auch found her e), aber ich sehe nicht, dass 2000 Verhalten documented und die Verwendung von SQL Server 2000 Kompatibilitätsmodus nicht hilft.

+1

Ich wusste nie über diese Verhaltensänderung - muss eine Menge Leute gefangen haben. –

Verwandte Themen