2008-08-25 6 views
1

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.

Antwort

1

Passing Spaltenwerte an eine Tabellenwert benutzerdefinierte Funktion in SQL Server 2000 wird nicht unterstützt Sie können Konstanten verwenden, so dass die folgende (einfachere Version) fehlschlagen würde auch:

SELECT *, (SELECT TOP 1 val FROM dbo.fnSplitStringToInt(usertable.legacyCSVVarcharCol, ',')) 
FROM usertable 

Es funktioniert jedoch auf SQL Server 2005, wie Sie herausgefunden haben.

0

Ich glaube nicht, Funktionen können Standardwerte in Funktionen in SS2K haben.

Was passiert, wenn Sie diese SQL in SS2K ausführen?

select val  
from dbo.fnSplitStringToInt('1,2,3', default) 
Verwandte Themen