我使用Visual Studio 2008的查询生成器工具来构建存储过程。这是预览脚本:
IF EXISTS (SELECT *
FROM sysobjects
WHERE name = 'SelectQuery' AND user_name(uid) = 'dbo')
DROP PROCEDURE dbo.SelectQuery
GO
CREATE PROCEDURE dbo.SelectQuery
(
@StudentID int
)
AS
SET NOCOUNT ON;
SELECT StudentID, StudentName, StudentPhone, StudentAddress,
StudentBirthDay, StudentDescription, StudentStatus
FROM tbl_Student
WHERE (StudentID LIKE '%' + @StudentID + '%')
GO
但是当我尝试执行它时,我收到了一个错误:
Error Message: Conversion fail when converting the value '%' to datatype int.
请帮助我!
答案 0 :(得分:6)
您想查找@StudentID
是StudentID
的子字符串的行吗?如果是的话
WHERE StudentID LIKE '%' + cast(@StudentID as varchar(10)) + '%'
应该工作。
答案 1 :(得分:1)
'%'不能与整数数据类型一起使用。当你有绝对的学生ID时,为什么你需要'%'?只需将它与'='进行比较。
如果你真的坚持使用'%',那么你必须将studentID的数据类型更改为varchar或类似的东西。
答案 2 :(得分:1)
我认为你确实需要这个
WHERE RIGHT(StudentID,12) LIKE '%' + RIGHT(@StudentID,12) + '%'
如果您想知道,RIGHT隐式地将非varchar数据转换为varchar。更正确的方法是明确使用CONVERT,但正如您所看到的,它更长。
WHERE (VARCHAR(20),StudentID) LIKE '%' + CONVERT(VARCHAR(20),@StudentID) + '%'
正如Martin指出,LIKE隐式转换LHS。不要以为我曾经这样尝试过但是有效吗
declare @studentid int set @studentid = 205
;with tmp as (select 201102050001 studentid)
select * from tmp
WHERE StudentID LIKE '%' + RIGHT(@StudentID,12) + '%'
-> output: 201102050001
答案 3 :(得分:0)
解决这个问题的一个简单方法是将StudentID转换为varchar。只需使用CONVERT(varchar, StudentID)
。