0

こんにちはすべて私は次のストアドプロシージャを持っています

SELECT DISTINCT QuestionId, AnswerId, COUNT(AnswerId) AS Cntr,
    (SELECT     COUNT(AnswerId) AS ttl
     FROM          QUserAnswers
     WHERE      (QuestionId = QUAM.QuestionId)) AS TtlCnt
FROM         QUserAnswers AS QUAM
WHERE     (QuestionId IN (@QuestionIdIn))
GROUP BY QuestionId, AnswerId
ORDER BY QuestionId

@QuestionIdI'形式で渡し1,2,3,4,5'ますが、varchar値'1,2,3,4,5,6'をデータ型に変換するときにエラーConversionが失敗しましたint

誰かが私にそれを整理するためのいくつかのポインタを与えることができますか

4

4 に答える 4

1

彼が提供したリンクでティム・シェルターによって提案されたように:-

まず、入力を解析する関数を作成する必要があります

 CREATE FUNCTION inputParser (@list nvarchar(MAX))
 RETURNS @tbl TABLE (number int NOT NULL) AS
 BEGIN
 DECLARE @pos        int,
       @nextpos    int,
       @valuelen   int

 SELECT @pos = 0, @nextpos = 1

 WHILE @nextpos > 0
 BEGIN
  SELECT @nextpos = charindex(',', @list, @pos + 1)
  SELECT @valuelen = CASE WHEN @nextpos > 0
                          THEN @nextpos
                          ELSE len(@list) + 1
                     END - @pos - 1
  INSERT @tbl (number)
     VALUES (convert(int, substring(@list, @pos + 1, @valuelen)))
  SELECT @pos = @nextpos
 END
 RETURN
END

次に、その関数をSPで使用します

 CREATE PROCEDURE usp_getQuestion
 @QuestionIdIn varchar(50) 
 AS
 Begin
 Select Distinct QuestionId, AnswerId, COUNT(AnswerId) AS Cntr,
    (SELECT     COUNT(AnswerId) AS ttl
      FROM   QUserAnswers
      WHERE      QuestionId = QUAM.QuestionId) as TtlCnt
 from QUserAnswers AS QUAM
 inner join inputParser (@QuestionIdIn) i ON QuaM.QuestionId = i.number
 GROUP BY QuestionId, AnswerId
 ORDER BY QuestionId
 End

EXEC usp_getQuestion '1, 2, 3, 4'
于 2012-07-26T12:22:56.583 に答える
0

そこでこのロジックを適用してみてください。

Declare @str varchar(100)='''1'',''2'',''3'',''4'',''5'''
select @str
DECLARE @s int = 1
select * from emp where CAST(@s as varchar) in ('1','2','3','4','5')
于 2012-07-26T11:44:23.570 に答える
0

それ以外の

WHERE     (QuestionId IN (@QuestionIdIn)) 

使用する

WHERE charindex(','+cast(@QuestionId as varchar(100))+',',','+@QuestionID+',')>0

パフォーマンスが気になる場合は、分割機能を使用してメインテーブルに結合してください

于 2012-07-26T11:26:31.523 に答える
0

状態を変更してみてください:

WHERE     (QuestionId IN (@QuestionIdIn))

where (','+@QuestionIdIn+',' like '%,'+convert(varchar(50),QuestionId)+',%')

たとえば、@ QuestionIdIn='1,2,3,4,5,6'およびQuestionId=3の場合、次のことを意味します。

where (',1,2,3,4,5,6,' like '%,3,%')

このリストに3が含まれている場合はどうなりますか。

于 2012-07-26T12:56:04.987 に答える