Sql server 在SQL Server 2000中将字符串拆分为多个值
我代表一个为我的客户工作的人问这个问题。实际上,我对mySQL比对SQL Server更熟悉,但不幸的是,SQL Server是客户机多年来一直使用的 问题基本上是这样的:SQL Server中有没有一种方法可以将字符串拆分为多个值,例如数组?可以在WHERE语句中使用 下面是一个PHP示例,说明了我所说的内容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是执行拆分
<?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