2011-10-25 17 views
0

ストアドプロシージャでSELECT ... FROM ... WHERE .. INクエリを実装する必要があります。WHERE ... IN ... SQL Serverストアドプロシージャの問題

は以下

ALTER PROCEDURE [dbo].[SP_GetQuestionSetMultiCat] 
    -- Add the parameters for the stored procedure here 
    @PIN varchar(50), 
    @CatIds varchar(50), 
    @Range int, 
    @Que_Type varchar(50) 

AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    declare @qtId as int; 
    select @qtId = Que_Type_Id from dbo.QuestionType_Tbl where [email protected]_Type; 


    -- Insert statements for procedure here 

     Select Top(@Range) 
      QId, 
      Que_Type_Id, 
      Que_Level_Id, 
      Que_Category_Id, 
      Que, 
      Opt1, 
      Opt2, 
      Opt3, 
      Opt4, 
      Ans 
     From 
      dbo.Que_Tbl 
     Where 
      (Que_Category_Id in (cast(@CatIds as varchar))) 
      and ([email protected]) 
      and (Qid not in (Select Que_Id From dbo.UserQuestion_Mapping where [email protected] and [email protected])) 


END 

ルックWHERE条件で私のストアドプロシージャのコードです。 Que_Category_Idはint型です。私が実行したいのは、 -

Where Que_Category_Id in (1,2,3,4) 

です。値は、私のC#コードから変換された文字列です。

Iは次のようにこのクエリを実行していた場合 - データ型intに{4,5,6} 'VARCHAR値を変換する際

変換が失敗しました -

exec SP_GetQuestionSetMultiCat '666777','4,5,6',5,'Practice' 

は、それがエラーを生成しています。

誰でもこの問題の解決方法を教えてください。

あなたの貴重な時間を共有してくれてありがとう。

答えて

3

1)Conversion failed when converting the varchar value '{4,5,6}' to data type int.

このエラーの理由はdata type precedenceあります。 INTデータ型は、VARCHARデータ型(16-INT対27-VARCHAR)よりも "高い"優先度を持ちます。 したがって、SQL Serverは'{4,5,6}'INTに変換しようとしていますが、逆もありません。

2)の代わりに、私はnodes(...) methodを使用してテーブル変数(@IDs)に次いでXML@CatIdsを変換します:

SET ANSI_WARNINGS ON; 

DECLARE @CatIds VARCHAR(50) = '4,5,6'; 

DECLARE @x XML; 
SET  @x = '<node>' + REPLACE(@CatIds, ',', '</node> <node>') + '</node>'; 
DECLARE @IDs TABLE 
(
    ID INT PRIMARY KEY 
); 
INSERT @IDs(ID) 
SELECT t.c.value('.', 'INT') 
FROM @x.nodes('/node') t(c); 

--Test  
SELECT * 
FROM @IDs 

3)次のステップはIN (SELECT ID FROM @IDs)代わりにin (cast(@CatIds as varchar))を使用してクエリを書き直すことである。

SET ANSI_WARNINGS ON; 

ALTER PROCEDURE [dbo].[SP_GetQuestionSetMultiCat] 
    -- Add the parameters for the stored procedure here 
    @PIN varchar(50), 
    @CatIds varchar(50), 
    @Range int, 
    @Que_Type varchar(50) 

AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    declare @qtId as int; 
    select @qtId = Que_Type_Id from dbo.QuestionType_Tbl where [email protected]_Type; 

    --Start: New T-SQL code 
    DECLARE @x XML; 
    SET  @x = '<node>' + REPLACE(@CatIds, ',', '</node> <node>') + '</node>'; 
    DECLARE @IDs TABLE 
    (
     ID INT PRIMARY KEY 
    ); 
    INSERT @IDs(ID) 
    SELECT t.c.value('.', 'INT') 
    FROM @x.nodes('/node') t(c); 
    --End 

    -- Insert statements for procedure here 

     Select Top(@Range) 
      QId, 
      Que_Type_Id, 
      Que_Level_Id, 
      Que_Category_Id, 
      Que, 
      Opt1, 
      Opt2, 
      Opt3, 
      Opt4, 
      Ans 
     From 
      dbo.Que_Tbl 
     Where 
      --The search condition is rewritten using IN(subquery) 
      Que_Category_Id in (SELECT ID FROM @IDs) 
      and ([email protected]) 
      and (Qid not in (Select Que_Id From dbo.UserQuestion_Mapping where [email protected] and [email protected])) 


END 

4)は、ストアドプロシージャを呼び出します。

exec SP_GetQuestionSetMultiCat '666777','4,5,6',5,'Practice' 
関連する問題