Ich habe Probleme die folgenden bekommen 2k in SQL Server zu arbeiten, aber es funktioniert in 2k5:Incosistency zwischen MSSql 2k und 2k5 mit Spalten als Funktionsargumente
--works in 2k5, not in 2k
create view foo as
SELECT usertable.legacyCSVVarcharCol as testvar
FROM usertable
WHERE rsrcID in
( select val
from
dbo.fnSplitStringToInt(usertable.legacyCSVVarcharCol, default)
)
--error message:
Msg 170, Level 15, State 1, Procedure foo, Line 4
Line 25: Incorrect syntax near '.'.
So ist legacyCSVVarcharCol eine Spalte enthält, Komma-getrennte Listen von INTs. Mir ist klar, dass dies ein riesiger WTF ist, aber das ist Legacy-Code, und momentan kann nichts über das Schema getan werden. Die Übergabe von "testvar" als Argument an die Funktion funktioniert auch nicht in 2k. In der Tat ergibt sich eine etwas andere (und noch seltsamer Fehler):
Msg 155, Level 15, State 1, Line 8
'testvar' is not a recognized OPTIMIZER LOCK HINTS option.
Passing eine hartcodierte Zeichenfolge als Argument für fnSplitStringToInt beide Werke in 2k und 2k5.
Weiß jemand, warum das in 2k nicht funktioniert? Ist dies ein bekannter Fehler im Abfrageplaner? Irgendwelche Vorschläge, wie es funktioniert? Wieder ist mir klar, dass die wirkliche Antwort lautet: "Speichern Sie keine CSV-Listen in Ihrer DB!", Aber leider liegt das außerhalb meiner Kontrolle.
Einige Beispieldaten, wenn es hilft:
INSERT INTO usertable (legacyCSVVarcharCol) values ('1,2,3');
INSERT INTO usertable (legacyCSVVarcharCol) values ('11,13,42');
Beachten Sie, dass die Daten in der Tabelle scheint nicht, da dies Fehler eine Syntax zur Materie, und es geschieht auch, wenn usertable völlig leer ist.
EDIT: Die Erkenntnis, dass vielleicht die anfängliche Beispiel war unklar, hier sind zwei Beispiele, von denen arbeitet und von denen nicht, was das Problem hervorheben sollte, die auftreten, ist:
--fails in sql2000, works in 2005
SELECT t1.*
FROM usertable t1
WHERE 1 in
(Select val
from
fnSplitStringToInt(t1.legacyCSVVarcharCol, ',')
)
--works everywhere:
SELECT t1.*
FROM usertable t1
WHERE 1 in
(Select val
from
fnSplitStringToInt('1,4,543,56578', ',')
)
Beachten Sie, dass die einzige Unterschied ist das erste Argument zu FnSplitStringToInt ist eine Spalte in dem Fall, die in 2k fehlschlägt und eine literale Zeichenfolge in dem Fall, der in beiden Fällen erfolgreich ist.