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