在使用’CASE’时,我遇到了一些我从未听过的问题.
问题是这样的:我在’SELECT’子句中使用’CASE’语句作为字段.调用具有int数据类型的列时,它是成功的;但是,在调用varchar或datetime时,它不成功.
在错误结果中,它说我标记了临时字段,包括’CASE’语句,作为int,但不是这样.请帮忙…
问题是这样的:我在’SELECT’子句中使用’CASE’语句作为字段.调用具有int数据类型的列时,它是成功的;但是,在调用varchar或datetime时,它不成功.
在错误结果中,它说我标记了临时字段,包括’CASE’语句,作为int,但不是这样.请帮忙…
The ‘STORED PROCEDURE’ Content
CREATE PROC spRegistry_PersonsGetField @ID int,@Field varchar(100) AS SELECT CASE @Field WHEN 'Name' THEN Name WHEN 'Surname' THEN Surname WHEN 'Username' THEN Username WHEN 'Password' THEN Password WHEN 'Status' THEN dbo.fnStatus(Status) WHEN 'EMail' THEN EMail WHEN 'Tel' THEN dbo.fnIsEmpty(Tel) WHEN 'Address' THEN dbo.fnIsEmpty(Address) WHEN 'City' THEN dbo.fnIsEmpty(City) WHEN 'BirthDate' THEN dbo.fnDate(BirthDate) WHEN 'Gender' THEN dbo.fnGender(Gender) WHEN 'Lang' THEN Lang ELSE NULL END AS [Alan] varchar(200) FROM Registry_Persons WHERE ID = @ID
我的查询
EXEC spRegistry_PersonsGetField 1,‘BirthDate’
错误消息
Conversion Failed when converting the varchar value ’04/11/2011′ to data type int.
解决方法
在评估CASE时,适用T-sql的
Precedence规则,以便计算出单个返回的数据类型.由于int的优先级高于varchar,因此尝试对int进行隐式转换.随后失败了.
要解决此问题,请将int或datetime表达式转换为varchar.