2013-05-03 102 views
0

这是情景:转换字符串转换成int SQL服务器

我的应用程序将具备以下条件:

  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) 
+0

[Split in SQL]可能的重复(http://stackoverflow.com/questions/2647/split-string-in-sql) – 2013-05-03 08:36:50

+0

在整个过程中使用适当的数据类型会更好。 SQL Server提供了一种用于存储多个值的类型 - 表。您可以使用[Table-Valued Parameters](http://msdn.microsoft.com/zh-cn/library/bb510489.aspx)将表格数据从客户端应用程序传递到SQL Server,当然,它可以轻松地将表格数据结果。 – 2013-05-03 08:36:51

回答

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')) 
+0

哇!完美,简单,易于重复使用。非常感谢你@Mukesh – user2059064 2013-05-03 08:49:22

0

您需要的值的@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 
0

使用此功能分割值:

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', ',') 
0

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

然后你不需要将ID转换为整数。