我遇到麻烦以下在SQL Server 2K的工作,但它在2K5工作:MS SQL 2K之间Incosistency和2K5与作为函数的参数列
--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 '.'.
所以,legacyCSVVarcharCol是包含列以逗号分隔的INT列表。我意识到这是一个巨大的WTF,但这是遗留代码,现在没有什么可以对模式做些什么。将“testvar”作为参数传递给函数在2k中也不起作用。事实上,它的结果稍有不同(甚至怪异的错误):
Msg 155, Level 15, State 1, Line 8
'testvar' is not a recognized OPTIMIZER LOCK HINTS option.
传递一个硬编码字符串作为参数传递给fnSplitStringToInt在2K和2K5工作。
有没有人知道为什么这不适用于2K?这可能是查询计划器中的一个已知错误?有关如何使其工作的任何建议?再次,我意识到真正的答案是“不要在您的数据库中存储CSV列表!”,但唉,这超出了我的控制范围。
一些样本数据,如果它可以帮助:
INSERT INTO usertable (legacyCSVVarcharCol) values ('1,2,3');
INSERT INTO usertable (legacyCSVVarcharCol) values ('11,13,42');
注意的是,在表中的数据似乎并不重要,因为这是一个语法错误,而且即使用户表完全是空的发生。
编辑:意识到也许最初的例子还不清楚,这里有两个例子,其中一个作品和它没有一个,这应该强调的是真实发生的问题:
--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', ',')
)
注意,只有不同之处在于fnSplitStringToInt的第一个参数是在2k失败的情况下的列和在两者都成功的情况下的文字字符串。