2008-08-25 17 views
1

我遇到麻烦以下在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失败的情况下的列和在两者都成功的情况下的文字字符串。

回答

1

传递列值表值用户定义函数在SQL Server 2000中不支持,你只能用常量,所以下面(简化版本)也将失败:

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

尽管如此,它仍然可以在SQL Server 2005上运行。

0

我不认为函数可以在SS2K函数中具有默认值。

当您在SS2K中运行此SQL时会发生什么?

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