【问题标题】:convert string into int SQL Server将字符串转换为 int SQL Server
【发布时间】:2013-05-03 08:23:41
【问题描述】:

这是场景:

我的应用将具有以下内容:

  1. 一个列表框(复选框属性已启用),它将显示某物的列表。
  2. 用户将使用复选框从列表框中进行选择(多选)。
  3. 我将循环进入所有选中的项目并将 ID 存储到一个数组中。我会将 ID 存储到类似这样的东西中,用逗号 (1,2,3,4) 分隔 ID,然后我将使用长度 -1 删除最后一个逗号。

如果我的存储过程是这样的,如何将字符串1,2,3,4转换成整数类型的数据?

Select * from tblSomething Where ID in (1,2,3,4)

【问题讨论】:

  • Split string in SQL的可能重复
  • 最好始终使用适当的数据类型。 SQL Server 提供了一种用于存储多个值的类型 - 表。您可以使用Table-Valued Parameters将表格数据从客户端应用程序传递到SQL Server,当然也可以轻松返回表格结果。

标签: sql sql-server string int varchar


【解决方案1】:

您可以使用以下 SQL 函数。

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[CommaSeparatedToString]
(
   @psCSString VARCHAR(8000)
)

RETURNS @otTemp TABLE(sID VARCHAR(20))
AS
BEGIN
DECLARE @sTemp VARCHAR(50)
WHILE LEN(@psCSString) > 0
BEGIN
SET @sTemp = LEFT(@psCSString, ISNULL(NULLIF(CHARINDEX(',', @psCSString) - 1, -1),
                LEN(@psCSString)))
SET @psCSString = SUBSTRING(@psCSString,ISNULL(NULLIF(CHARINDEX(',', @psCSString), 0),
                           LEN(@psCSString)) + 1, LEN(@psCSString))
INSERT INTO @otTemp VALUES (@sTemp)
END
RETURN
END

然后像

一样调用你的存储过程
Select * from tblSomething 
Where ID in (SELECT * FROM CommaSeparatedToString('1,2,3,4'))

【讨论】:

  • 哇!完美、简单且易于重复使用。非常感谢@Mukesh
【解决方案2】:

你可以使用

从表中选择 CAST(MyVarcharCol AS INT)

从表中选择 CONVERT(INT, MyVarcharCol)

参考这个链接 http://msdn.microsoft.com/en-us/library/ms187928.aspx

【讨论】:

    【解决方案3】:

    您需要为此创建动态查询

    例如,您正在获取 @values 参数中的值列表,因此准备并运行这样的动态查询

        DECLARE @query NVARCHAR(500)
        DECLARE @values VARCHAR(200)
        SET @values='1,2'
    
        SET @query =N'Select * from tblSomething  Where ID in ( ' + @values + ')'
        SELECT @query
         EXEC @Query
    

    【讨论】:

      【解决方案4】:

      使用此函数拆分值:

      CREATE FUNCTION [dbo].[udfSplitCSV]
      (
       @String varchar (max),
       @Delimiter varchar (10) = ','
      )
      
      RETURNS @ValueTable TABLE ([Row] int IDENTITY(1,1), [Value] varchar(max), [Length] int, [Duplicate] int NULL)
      
      BEGIN
      
      DECLARE @NextString varchar(max)
      DECLARE @Pos int
      DECLARE @NextPos int
      
      IF  @String IS NULL RETURN 
      
       --Initialize
      SET @NextString = ''
      SET @String = @String + @Delimiter
      
       --Get position of first Comma
      SET @Pos = charindex(@Delimiter,@String)
      SET @NextPos = 1
      
       --Loop while there is still a comma in the String
       WHILE (@Pos <>  0)  
         BEGIN
         SET @NextString = RTrim(LTrim(SubString(@String,1,@Pos - 1)))
         INSERT INTO @ValueTable ([Value], [Length]) VALUES (@NextString, Len(@NextString))
         SET @String = SubString(@String,@Pos+1,Len(@String))
         SET @NextPos = @Pos
         SET @Pos  = CharIndex(@Delimiter,@String)
         END
      
      UPDATE @ValueTable
         SET [Duplicate] = X.Duplicate
         FROM @ValueTable VT
         INNER JOIN (Select [Row], [Value], Row_Number() OVER (Partition By [Value] ORDER BY [Value], [Row]) as Duplicate FROM @ValueTable) X
            ON X.[Row] = VT.[Row]
      
      RETURN
      END
      
      -- Select * from dbo.udfSplitCSV('a   , c b,c, a', ',')
      

      【讨论】:

        【解决方案5】:

        当您将一堆 ID 存储到数组中时,使用单引号存储。 所以它将是 ('1','2','3')。

        那么你就不需要将 ID 转换为整数了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-02
          • 2011-03-06
          相关资源
          最近更新 更多