2011-02-05 8 views
0

私は、Visual Studio 2008のクエリビルダツールを使用してストアドプロシージャを構築しました。これは、プレビュースクリプトです:intパラメータを持つストアドプロシージャのように使用するには?

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

このクエリの目的を説明できますか?あなたは部分文字列のマッチをしようとしていますか?(ワイルドカードが必要な唯一の時間でしょう) –

+0

INTを使ってLIKEを適用したいものは何ですか?意味がありません.... INTが一致するかどうか。 int型の "LIKE"はありません...あなたは何をしようとしていますか? .....詳細を説明してください..... –

答えて

6

@StudentIDの部分文字列がStudentIDの行を探したいですか?その場合

WHERE StudentID LIKE '%' + cast(@StudentID as varchar(10)) + '%' 

+0

+1 LHSを変換せずにLIKEを試みたことはありません – RichardTheKiwi

0

これを回避する簡単な方法は、StudentIDをvarcharに変換することです。ちょうどCONVERT(varchar, StudentID)を使用してください。

+1

これはOPのエラーを修正しません。これは ''%' + @StudentID + '%''連結から来ています。 –

1

'%'は整数データ型では使用できません。学生IDが絶対持っていると、なぜあなたは '%'を必要としますか?単にそれを '='と比較してください。

あなたが本当に '%'の使用を主張しているのであれば、studentIDのデータ型をvarcharなどに変更する必要があります。

+0

おそらく、OPは '@ StudentID'が' StudentID'の部分文字列である行を探しています。 '= 'はこれではうまくいかないでしょう。 –

+0

@Martin:そのようなシナリオかもしれません。しかし、シナリオであれば彼のデザインが間違っていると思いませんか? – Pradeep

+0

私はちょうどそれについて考えていた。おそらくそうだ!私がそれが漠然と有用であることを見ることができる唯一の時間は、オペレータがID全体ではなく学生の断片にタイプすることを可能にするフロントエンドがある場合であろう。明らかにすべてのクエリがシークではなくスキャンで終了することは明らかです。 –

1

私はあなたが実際にRIGHT暗黙的にvarchar型に非varcharデータを変換し、あなたが思っている場合には、この

WHERE RIGHT(StudentID,12) LIKE '%' + RIGHT(@StudentID,12) + '%' 

が必要だと思います。より適切な方法はCONVERTを明示的に使用することですが、わかるようにより長いです。

WHERE (VARCHAR(20),StudentID) LIKE '%' + CONVERT(VARCHAR(20),@StudentID) + '%' 

マーティンはを指摘するように、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 
+1

LIKEは暗黙の変換を強制します。そしてなぜ12? intの最大値は '2147483647'ですか? (私は11が潜在的な '-'文字を扱うことが分かります) –

+0

注意:' LIKE'が行う暗黙的な変換は 'varchar(12)'にもありますが、その理由はわかりません! –

+0

ありがとう、サイバースキー、それは働いた。 –

関連する問題