Reputation: 10805
In my stored procedure, I am facing the following problem - how can i fix this?
CREATE PROC RupeshTest(@QueID int, @Answer varchar(250)) as
BEGIN
DECLARE @STR varchar(4000)
SELECT @STR = COALESCE(@str + ';','') + AnswerText
FROM SurveyQuestionAnswerTypes
WHERE AnswerType = (SELECT AnswerType
FROM SurveyQuestions
WHERE QuestionID = CAST(@QueId AS VARCHAR(4)))
AND AnswerValue IN (REPLACE(@Answer,'^',','))
END
When I run it
RupeshTest 25, '2^3^5^7^8'
I get following error
Msg 245, Level 16, State 1, Procedure RupeshTest, Line 4
Conversion failed when converting the varchar value '2,3,5,7,8' to data type int.
Although I understand the problem, but unable to fix it, could some body tell me how can I fix it.
Upvotes: 0
Views: 7554
Reputation: 460
This wont work, since the final Query being formed is :
SELECT @STR = COALESCE(@str + ';','') + AnswerText
FROM SurveyQuestionAnswerTypes
WHERE AnswerType = (SELECT AnswerType
FROM SurveyQuestions
WHERE QuestionID = CAST(@QueId AS VARCHAR(4)))
AND AnswerValue IN ('2,3,5,7,8')
Where as you want something like this:
SELECT @STR = COALESCE(@str + ';','') + AnswerText
FROM SurveyQuestionAnswerTypes
WHERE AnswerType = (SELECT AnswerType
FROM SurveyQuestions
WHERE QuestionID = CAST(@QueId AS VARCHAR(4)))
AND AnswerValue IN (2,3,5,7,8)
I would advice you to make a UDF String_To_Table, pass the string to that UDF and use for the IN clause.
String_To_Table UDF:
CREATE FUNCTION [dbo].[String_To_Table]
(@string VARCHAR(4000),
@delimiter CHAR(1) = ';')
RETURNS @tbl TABLE (ord INT IDENTITY(1, 1) NOT NULL,
token VARCHAR(500)) AS
BEGIN
DECLARE @pos int,
@textpos int,
@chunklen smallint,
@tmpstr varchar(4000),
@leftover varchar(4000),
@tmpval varchar(4000)
SET @textpos = 1
SET @leftover = ''
WHILE @textpos <= datalength(@string)
BEGIN
SET @chunklen = 4000 - datalength(@leftover)
SET @tmpstr = @leftover + substring(@string, @textpos, @chunklen)
SET @textpos = @textpos + @chunklen
SET @pos = charindex(@delimiter, @tmpstr)
WHILE @pos > 0
BEGIN
SET @tmpval = ltrim(rtrim(left(@tmpstr, @pos - 1)))
INSERT @tbl (token) VALUES(@tmpval)
SET @tmpstr = substring(@tmpstr, @pos + 1, len(@tmpstr))
SET @pos = charindex(@delimiter, @tmpstr)
END
SET @leftover = @tmpstr
END
IF ltrim(rtrim(@leftover)) <> ''
INSERT @tbl(token) VALUES (ltrim(rtrim(@leftover)))
RETURN
END
Then you can change your SP as below:
CREATE PROC RupeshTest(@QueID int, @Answer varchar(250)) as
BEGIN
DECLARE @STR varchar(4000)
SELECT @STR = COALESCE(@str + ';','') + AnswerText
FROM SurveyQuestionAnswerTypes
WHERE AnswerType = (SELECT AnswerType
FROM SurveyQuestions
WHERE QuestionID = CAST(@QueId AS VARCHAR(4)))
AND AnswerValue IN (SELECT Token FROM dbo.String_To_Table(@Answer,'^'))
END
Upvotes: 2
Reputation: 1017
You could replace the last condition with
AND CHARINDEX(CONCAT("^", CAST(AnswerValue AS CHAR), "^"), CONCAT("^", @Answer, "^"))
It doesn't seem totally right, but it might do the trick.
edited
Thanks for the corrections.
Upvotes: 0
Reputation: 66641
The problem you are facing here is the part AnswerValue IN (2,3,5,7,8)
and how to make it valid SQL because the values are a list of Integers and you have them as strings. One trick for me is to make all the SQL command a string and Execute it:
DECLARE @SQLQuery AS varchar(4000)
SET SQLQuery =
'SELECT AnswerText '
+ ' FROM SurveyQuestionAnswerTypes '
+ ' WHERE AnswerType = (SELECT AnswerType '
+ ' FROM SurveyQuestions '
+ ' WHERE QuestionID = ' + CAST(@QueId AS VARCHAR(4)))
+ ' AND AnswerValue IN (' + (REPLACE(@Answer,'^',',')) + ')'
EXECUTE(@SQLQuery)
by the way, there is no reason to send the numbers with the ^ and then change it.
Upvotes: 1