如何在存储过程中使用int参数?

时间:2011-02-05 07:51:17

标签: sql tsql stored-procedures

我使用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.

请帮助我!

4 个答案:

答案 0 :(得分:6)

您想查找@StudentIDStudentID的子字符串的行吗?如果是的话

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)