Sql server 在SQL Server 2000中将字符串拆分为多个值

Sql server 在SQL Server 2000中将字符串拆分为多个值,sql-server,tsql,sql-server-2000,Sql Server,Tsql,Sql Server 2000,我代表一个为我的客户工作的人问这个问题。实际上,我对mySQL比对SQL Server更熟悉,但不幸的是,SQL Server是客户机多年来一直使用的 问题基本上是这样的:SQL Server中有没有一种方法可以将字符串拆分为多个值,例如数组?可以在WHERE语句中使用 下面是一个PHP示例,说明了我所说的内容 <?php $string = "10,11,12,13"; $explode = explode(",", $string); ?> SPLIT是执行拆分

我代表一个为我的客户工作的人问这个问题。实际上,我对mySQL比对SQL Server更熟悉,但不幸的是,SQL Server是客户机多年来一直使用的

问题基本上是这样的:SQL Server中有没有一种方法可以将字符串拆分为多个值,例如数组?可以在WHERE语句中使用

下面是一个PHP示例,说明了我所说的内容

<?php
    $string = "10,11,12,13";
    $explode = explode(",", $string);
?>
SPLIT是执行拆分的伪代码函数

我不在PHP中这样做的原因是,查询是由报表软件构造的,在将其发送到数据库之前,我们无法执行逻辑,例如我的PHP代码,并且软件将多个值作为单个字符串返回,由管道|分隔

不幸的是,我没有访问报告软件,我想他说它叫做Logi或LogiReports,或者我的同事正在起草的查询,但对于这个问题来说,真正重要的是WHERE条款

有什么想法吗?

这里有几种方法:

对于短字符串,我更喜欢


我可以从这里复制/粘贴,但它确实值得一读

动态SQL可以使用:

declare @in varchar(10)
set @in = '10,11,12,13'
exec ('SELECT {long field list] FROM {tables} WHERE hour IN (' + @in + ')')

您可以使用一个函数来接收包含由管道分隔的id的字符串,并将其作为表返回,您可以在子查询中查询和使用该表,如下所示:

SELECT {long field list] FROM {tables} WHERE hour IN SPLIT(",", "10,11,12,13")
SELECT {long field list] FROM {tables} WHERE hour IN 
(SELECT OrderID from dbo.SplitOrderIDs('2001,2002'))


ALTER FUNCTION [dbo].[SplitOrderIDs]
(
@OrderList varchar(500)
)
RETURNS 
@ParsedList table
(
OrderID int
)
    AS
    BEGIN
    DECLARE @OrderID varchar(10), @Pos int

SET @OrderList = LTRIM(RTRIM(@OrderList))+ ','
SET @Pos = CHARINDEX(',', @OrderList, 1)

IF REPLACE(@OrderList, ',', '') <> ''
BEGIN
    WHILE @Pos > 0
    BEGIN
        SET @OrderID = LTRIM(RTRIM(LEFT(@OrderList, @Pos - 1)))
        IF @OrderID <> ''
        BEGIN
            INSERT INTO @ParsedList (OrderID) 
            VALUES (CAST(@OrderID AS int)) --Use Appropriate conversion
        END
        SET @OrderList = RIGHT(@OrderList, LEN(@OrderList) - @Pos)
        SET @Pos = CHARINDEX(',', @OrderList, 1)

    END
END 

RETURN
END

您可以使用此存储过程。 我希望这对你有用。


这被标记为SQLServer2000;如果是2005年,有一个新的表值用户定义函数可以很好地完成这类事情哈哈,你不知道我说了多少如果只有这些家伙在使用2005-我说了很多事情,包括缺少HashBytes函数。不幸的是,这是服务器2000。我不确定这在我的情况下是否有用,因为从技术上讲,他所做的不是我的合同所描述的项目,但我会将链接转发给他,并假设编写良好的指南是有用的。这实际上似乎是最实际的解决方案。我用客户ID在一个简单的查询中进行了尝试,效果非常好。我已将此转发给我的同事。注意:DuDynamicSQL的性能不是很好。它每次重新编译SQL语句并重新生成执行计划。但如果它不是经常使用或不需要硬计划,它似乎是合理的。
CREATE PROCEDURE SP_STRING_SPLIT (@String varchar(8000),@Separator Char(10),@pos_select int=0)

AS

BEGIN

SET NOCOUNT ON

DECLARE @Caracter varchar(8000)

DECLARE @Pos int

Set @Pos=1

Set @Caracter=''

CREATE TABLE #ARRAY
    (   String  varchar(8000)   NOT NULL,
        Pos     int         NOT NULL IDENTITY (1, 1)

    )


While (@Pos<=len(@String))
Begin

    If substring(@String,@Pos,1)=Ltrim(Rtrim(@Separator))
        Begin

            INSERT INTO #ARRAY SELECT @Caracter
            SET @Caracter=''
        End
    Else
        Begin   
            --forma la palabra}
            Set @Caracter=@Caracter+substring(@String,@Pos,1)

        End


    If @Pos=len(@String)
        Begin
            INSERT INTO #ARRAY SELECT @Caracter
        End

        SET @Pos=@Pos+1

    End

     SELECT Pos,String FROM #ARRAY where (Pos=@pos_select Or @pos_select=0)
END

 GO

 exec SP_STRING_SPLIT  'HELLO, HOW ARE YOU?',',',0