Sql server 2008 从逗号分隔的字符串输入中获取数据

Sql server 2008 从逗号分隔的字符串输入中获取数据,sql-server-2008,Sql Server 2008,我有一个存储过程,其中输入是一个逗号分隔的字符串,比如“12341345671244612997”,它不确定输入字符串是否总是携带数字数据。它可能是“12341,34as67,12$46,1we97”,因此我需要验证它们,并在查询中仅使用有效数据 假设我的查询是(其中列OrderCode是int类型) 或者,如果其他数据无效,则仅使用有效数据 select * from dbo.DataCollector where OrderCode in (12341) 对于这种情况,什么是一个好的解决方

我有一个存储过程,其中输入是一个逗号分隔的字符串,比如“12341345671244612997”,它不确定输入字符串是否总是携带数字数据。它可能是“12341,34as67,12$46,1we97”,因此我需要验证它们,并在查询中仅使用有效数据

假设我的查询是(其中列OrderCode是int类型)

或者,如果其他数据无效,则仅使用有效数据

select * from dbo.DataCollector where OrderCode in (12341)

对于这种情况,什么是一个好的解决方案。

在SQl Server 2005中也可以使用的一种方法是创建一个拆分函数,然后您可以使用
ISNUMERIC
检查它是否是一个数字:

DECLARE @Input VARCHAR(MAX) = '12341,34as67,12$46,1we97' 

SELECT i.Item FROM dbo.Split(@Input, ',')i
WHERE  IsNumeric(i.Item) = 1

您的完整查询:

select * from dbo.DataCollector 
where OrderCode in ( SELECT i.Item FROM dbo.Split(@Input, ',')i
                     WHERE  IsNumeric(i.Item) = 1 )
以下是我使用的拆分函数:

CREATE FUNCTION [dbo].[Split]
(
    @ItemList NVARCHAR(MAX), 
    @delimiter CHAR(1)
)
RETURNS @ItemTable TABLE (Item VARCHAR(250))  
AS      

BEGIN    
    DECLARE @tempItemList NVARCHAR(MAX)
    SET @tempItemList = @ItemList

    DECLARE @i INT    
    DECLARE @Item NVARCHAR(4000)

    SET @i = CHARINDEX(@delimiter, @tempItemList)

    WHILE (LEN(@tempItemList) > 0)
    BEGIN
        IF @i = 0
            SET @Item = @tempItemList
        ELSE
            SET @Item = LEFT(@tempItemList, @i - 1)
        INSERT INTO @ItemTable(Item) VALUES(@Item)
        IF @i = 0
            SET @tempItemList = ''
        ELSE
            SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i)
        SET @i = CHARINDEX(@delimiter, @tempItemList)
    END 
    RETURN
END  
编辑根据Damien的评论,
ISNUMERIC
有它的问题。您可以使用此函数检查它是否为实整数:

CREATE FUNCTION dbo.IsInteger(@Value VarChar(18))
RETURNS Bit
AS 
BEGIN

  RETURN IsNull(
     (Select Case When CharIndex('.', @Value) > 0 
                  Then Case When Convert(int, ParseName(@Value, 1)) <> 0
                            Then 0
                            Else 1
                            End
                  Else 1
                  End
      Where IsNumeric(@Value + 'e0') = 1), 0)    
END
创建函数dbo.IsInteger(@Value VarChar(18))
返回位
作为
开始
返回值为空(
(当CharIndex('.',@Value)>0时选择大小写)
转换时的大小写(int,ParseName(@Value,1))0
然后0
其他1
终点
其他1
终点
其中IsNumeric(@Value+'e0')=1),0)
结束
下面是另一个damien的“错误”输入示例,其中包含
0d0


最好使用本机支持多个值的数据类型(即XML或表值参数)将多个值传递给存储过程,
ISNUMERIC
有它自己的问题,因为它可以接受
0d0
。@Damien_异教者:很好,添加了另一个应该排除这些字符的函数。
CREATE FUNCTION dbo.IsInteger(@Value VarChar(18))
RETURNS Bit
AS 
BEGIN

  RETURN IsNull(
     (Select Case When CharIndex('.', @Value) > 0 
                  Then Case When Convert(int, ParseName(@Value, 1)) <> 0
                            Then 0
                            Else 1
                            End
                  Else 1
                  End
      Where IsNumeric(@Value + 'e0') = 1), 0)    
END