C# 将varchar值转换为数据类型int时存储过程转换失败?

C# 将varchar值转换为数据类型int时存储过程转换失败?,c#,asp.net,sql-server,tsql,stored-procedures,C#,Asp.net,Sql Server,Tsql,Stored Procedures,在我的存储过程中,我面临以下问题-如何解决这个问题 CREATE PROC RupeshTest(@QueID int, @Answer varchar(250)) as BEGIN DECLARE @STR varchar(4000) SELECT @STR = COALESCE(@str + ';','') + AnswerText FROM SurveyQuestionAnswerTypes WHERE AnswerType = (SELECT An

在我的存储过程中,我面临以下问题-如何解决这个问题

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
当我运行它时

RupeshTest 25, '2^3^5^7^8' 
我得到以下错误

Msg 245,16级,状态1,程序测试,第4行
将varchar值“2,3,5,7,8”转换为数据类型int时,转换失败


虽然我理解这个问题,但无法解决它,有人能告诉我如何解决它吗。

这不起作用,因为最终形成的查询是:

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')
当你想要这样的东西时:

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)
我建议您创建一个UDF字符串到表,将字符串传递给该UDF并用于IN子句

字符串到表格自定义项:

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

这不起作用,因为形成的最终查询是:

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')
当你想要这样的东西时:

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)
我建议您创建一个UDF字符串到表,将字符串传递给该UDF并用于IN子句

字符串到表格自定义项:

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

您在这里面临的问题是(2,3,5,7,8)中的部分
AnswerValue,以及如何使其成为有效的SQL,因为这些值是一个整数列表,并且它们是字符串。我的一个技巧是将所有SQL命令都设置为字符串并执行它:

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)                  

顺便说一句,没有理由发送带有^的数字,然后再更改。

您在这里面临的问题是(2,3,5,7,8)
中的部分应答值,以及如何使其成为有效的SQL,因为这些值是一个整数列表,并且它们是字符串。我的一个技巧是将所有SQL命令都设置为字符串并执行它:

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)                  

顺便说一句,没有理由发送带有“^”的数字,然后更改它。

您可以用“^”替换上一个条件

AND CHARINDEX(CONCAT("^", CAST(AnswerValue AS CHAR), "^"), CONCAT("^", @Answer, "^"))
这似乎并不完全正确,但可能会奏效

已编辑


谢谢您的更正。

您可以用

AND CHARINDEX(CONCAT("^", CAST(AnswerValue AS CHAR), "^"), CONCAT("^", @Answer, "^"))
这似乎并不完全正确,但可能会奏效

已编辑



感谢您的更正。

我在替换函数中遇到了问题。.格式化工作很好:-)可能与您尝试的神奇编程重复-为什么您希望SQL语言在单个字符串参数中进行搜索,并决定将其拆分为逗号并将其转换为多个参数,当我所知道的其他编程语言都无法做到这一点时?解决方案是将SQL命令作为字符串生成/创建并运行它。我在替换函数中遇到了问题..格式化工作很好:-)可能与您尝试的神奇编程重复-为什么您希望SQL语言在单个字符串参数内窥视,当我所知道的任何其他编程语言都无法做到这一点时,决定它应该围绕逗号将其拆分并将其转换为多个参数?解决方案是将SQL命令制作/创建为字符串并运行它。总有一天,MS的某个人会向我解释为什么SQL Server仍然没有内置的“拆分”方法。重要的安全问题:OP应该非常确定输入字符串实际上不是DROP TABLE Students--^4最近有一天,MS的某个人会向我解释为什么SQL Server仍然没有内置的“拆分”方法。重要的安全问题:OP应该非常确定输入字符串实际上不是DROP TABLE Students--^4是的,我刚才想。很抱歉,我将修复itLOCATE(MySQL)或CHARINDEX(MSSQL)将不是一个好的解决方案。当输入像RupeshTest 25,'112^233^225895^9967^1238'时,SP将失败。结果将匹配1、2、3、8、9、11、12、23、38等组合。您是对的。也许它应该是CHARINDEX(“^”+CAST(AnswerValue为CHAR)+“^”、“^”+@Answer++“^”)@avanigadhai我不能评论你的答案,但你不应该在调用String_To_Table的子查询中选择token而不是ID吗?我对mssql不是很熟悉,所以我可能遗漏了一些东西。你说得对@PerroAzul。谢谢你指出这一点。我的错误。我会改正的。是的,我只是想。很抱歉,我将修复itLOCATE(MySQL)或CHARINDEX(MSSQL)将不是一个好的解决方案。当输入像RupeshTest 25,'112^233^225895^9967^1238'时,SP将失败。结果将匹配1、2、3、8、9、11、12、23、38等组合。您是对的。也许它应该是CHARINDEX(“^”+CAST(AnswerValue为CHAR)+“^”、“^”+@Answer++“^”)@avanigadhai我不能评论你的答案,但你不应该在调用String_To_Table的子查询中选择token而不是ID吗?我对mssql不是很熟悉,所以我可能遗漏了一些东西。你说得对@PerroAzul。谢谢你指出这一点。我的错误。我会改正的。