Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 具有d次迭代的SQL Server字符串子字符串_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 具有d次迭代的SQL Server字符串子字符串

Sql server 具有d次迭代的SQL Server字符串子字符串,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有一个字符串: @TempCol = sigma_x1,sigma_x2,...,sigma_xd,XX,YY,ZZ 我想得到一个子字符串来得到字符串sigma_x1,sigma_x2,…,sigma_xd d是一个变量,所以它可以是1,3,20,…,等等 我知道d的值,但我不知道的是如何获得原始字符串的d项的子字符串 我试过这个: @L = '' SET @ColumnNo = 0 WHILE @ColumnNo <= @d BEGIN SET @L = @L + '

我有一个字符串:

@TempCol  =  sigma_x1,sigma_x2,...,sigma_xd,XX,YY,ZZ
我想得到一个子字符串来得到字符串sigma_x1,sigma_x2,…,sigma_xd

d是一个变量,所以它可以是1,3,20,…,等等

我知道d的值,但我不知道的是如何获得原始字符串的d项的子字符串

我试过这个:

@L = ''
SET @ColumnNo = 0
WHILE @ColumnNo <= @d
BEGIN
    SET @L  =  @L + ' ' + SUBSTRING(@TempCol, 1, CHARINDEX(',',@TempCol)-1 )
    SET @TempCol    = REPLACE  ( @TempCol,  LTRIM(RTRIM(@L) ) ,'')
    Set @ColumnNo   = @ColumnNo + 1 
    PRINT @L
END 

但我不知道如何获得预期的结果。

您需要的是底部显示的拆分函数

With SplitItems As
    (
    Select Position, Value
        , Row_Number() Over ( Order By Position ) As ItemNum
    From dbo.udf_Split( @TempCol, ',' )
    )
Select Value
From SplitItems
Where ItemNum <= @d
如果您希望组装的字符串达到给定点,只需执行以下操作:

With SplitItems As
    (
    Select Position, Value
        , Row_Number() Over ( Order By Position ) As ItemNum
    From dbo.udf_Split( @TempCol, ',' )
    )
Select ',' + Value
From SplitItems
Where ItemNum <= @d
Order By ItemNum
For Xml Path('')
拆分功能:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create FUNCTION [dbo].[udf_Split]
(   
    @DelimitedList nvarchar(max)
    , @Delimiter nvarchar(2) = ','
)
RETURNS TABLE 
AS
RETURN 
    (
    With CorrectedList As
        (
        Select Case When Left(@DelimitedList, Len(@Delimiter)) <> @Delimiter Then @Delimiter Else '' End
            + @DelimitedList
            + Case When Right(@DelimitedList, Len(@Delimiter)) <> @Delimiter Then @Delimiter Else '' End
            As List
            , Len(@Delimiter) As DelimiterLen
        )
        , Numbers As 
        (
        Select TOP( Coalesce(DataLength(@DelimitedList)/2,0) ) Row_Number() Over ( Order By c1.object_id ) As Value
        From sys.columns As c1
            Cross Join sys.columns As c2
        )
    Select CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen As Position
        , Substring (
                    CL.List
                    , CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen     
                    , CharIndex(@Delimiter, CL.list, N.Value + 1)                           
                        - ( CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen ) 
                    ) As Value
    From CorrectedList As CL
        Cross Join Numbers As N
    Where N.Value <= DataLength(CL.List) / 2
        And Substring(CL.List, N.Value, CL.DelimiterLen) = @Delimiter
    )
基本上,循环只搜索要剪切的最终位置。在循环之后提取子字符串


如果您指定的@d太大,则结果将是所有@TempCol,否则您将获得所需的项数。

在@L的第一个赋值中,@L初始化为什么,L是什么?抱歉,我写错了,它的意思是@L而不是L,我试图连接,但没有成功@L的初始化方式类似于@L=,因此基本上您希望从字符串@TempCol='item1,item2,…'中提取包含前@d个项的子字符串。是这样吗?有一个问题,当我使用动态sql时,我如何在我的存储过程中使用这个UDF??,我试图调用,但它说有一个错误??有没有办法只在存储过程中使用循环?@darkcminor-使用动态SQL到底是为了什么?为什么?您可以使分割的UDF永久化,因为它可以经常重用。只需要构建或组装第一个查询。
DECLARE @TempCol varchar(max), @d int, @p int, @Result varchar(max);
SET @TempCol = 'item1,item2,itemA,itemB,item#,item$';
SET @d = 3;

SET @p = 1;

WHILE @d > 0 AND @p > 0 BEGIN
  SET @p = CHARINDEX(',', @TempCol, @p);
  IF @p > 0 SET @p = @p + 1;
  SET @d = @d - 1;
END;

IF @p = 0
  SET @Result = @TempCol
ELSE
  SET @Result = SUBSTRING(@TempCol, 1, @p - 2);

SELECT @Result;