【问题标题】:SQL Server Simple example for the use of Delimiter in Stored ProcedureSQL Server 存储过程中使用分隔符的简单示例
【发布时间】:2014-01-27 21:27:09
【问题描述】:

令人惊讶的是,没有任何直接的示例来演示在存储过程中使用分隔符吗?

我有一个字符串变量作为输入(带分隔符),并希望将其作为存储过程中的条件。如下所示:

CREATE PROCEDURE testing
(
    @stringVar    NVARCHAR(255) = NULL
)
....
BEGIN

    Select * from table where column not in (@stringVar)

.....
END

@stringVar 的示例值为 a~b~c~d

我应该如何处理这种情况? Sql Server 中是否有内置的分隔符功能?

【问题讨论】:

    标签: sql sql-server stored-procedures delimiter


    【解决方案1】:

    如果只是为了测试存在那么:

    Select * from table where CHARINDEX('~'+column+'~' , '~'+@stringVar+'~' ,1)=0
    

    【讨论】:

      【解决方案2】:

      Sql Server 中没有任何内置的分隔符功能。为此,您可以使用用户定义的表值函数。

      Create FUNCTION [dbo].[fnSplitString]
      (@pString varchar(max),@pSplitChar char(1))
      returns @tblTemp table (tid int,value varchar(1000))
      as
      begin
      
          declare @vStartPosition     int
          declare @vSplitPosition     int
          declare @vSplitValue        varchar(1000)
          declare @vCounter       int
          set @vCounter=1
      
          select @vStartPosition = 1,@vSplitPosition=0
      
          set @vSplitPosition = charindex( @pSplitChar , @pString , @vStartPosition )
          if (@vSplitPosition=0 and len(@pString) != 0)
          begin
              INSERT INTO @tblTemp
                  (
                  tid     ,
                  value   
                  )
              VALUES
                  (
                  1   ,
                  @pString        
                  )
              return      --------------------------------------------------------------->>
          end
          set @pString=@pString+@pSplitChar
          while (@vSplitPosition > 0 )
          begin
              set @vSplitValue = substring( @pString , @vStartPosition , @vSplitPosition - @vStartPosition )
              set @vSplitValue = ltrim(rtrim(@vSplitValue))
      
              INSERT INTO @tblTemp
                  (
                  tid     ,
                  value   
                  )
              VALUES
                  (
                  @vCounter   ,
                  @vSplitValue        
                  )
              set @vCounter=@vCounter+1
              set @vStartPosition = @vSplitPosition + 1
              set @vSplitPosition = charindex( @pSplitChar , @pString , @vStartPosition )
          end
      
          return
      end
      

      【讨论】:

        【解决方案3】:

        在 SQL Server 中实现拆分函数的方法有很多种,具有许多不同的性能特征:一些(ab)使用 SQL Server 的 XML 功能,一些使用 Tally 表,一些使用 CLR 等等。 em> 有关其中一种方法的描述和性能比较,我建议您查看 Jeff Moden 在SQL Server Central 上的文章(需要注册)。

        一旦你有一个可用的表值拆分器函数,你就可以简单地实现你的选择:

        select *
        from MyTable t
        where t.MyColumn not in (select Item from dbo.MySplit(@stringVar, '~') where Item is not null)
        ;
        

        【讨论】:

          【解决方案4】:

          这是一个有点棘手的情况,没有“简单的方法”来做到这一点。但我可以给你最简单的方法。

          你需要做两件事来完成这项工作,

          1) 创建一个Split函数,其参数为delimited 字符串并拆分这些值。
          2) 将您的存储过程放在一个 传递分隔字符串的方式传递给该函数,然后 拆分后的值传递给存储过程

          拆分函数

          CREATE FUNCTION [dbo].[FnSplit]
          (
          @List nvarchar(2000),
          @SplitOn nvarchar(5)
          )
          RETURNS @RtnValue table (Id int identity(1,1),Value nvarchar(100))
          AS
           BEGIN
          
            While(Charindex(@SplitOn,@List)>0)
          
             Begin
          
                Insert Into @RtnValue (value)
                 Select Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1))) 
          
            Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
          
            End
          
              Insert Into @RtnValue (Value)
          
             Select Value = ltrim(rtrim(@List))
          
            Return
          
          END
          

          你的过程

          CREATE PROCEDURE testing
          (
              @stringVar    NVARCHAR(255) = NULL
          )
          ....
          BEGIN
          
              Select * from table 
              where column not IN(SELECT Value 
                                  FROM dbo.FnSplit(@stringVar,'~'))
          
          .....
          END
          

          【讨论】:

            【解决方案5】:

            从 SQL Server 2008 开始,您可以使用表值参数

            我无法比这里更好地解释它:http://www.sommarskog.se/arrays-in-sql.html

            【讨论】:

              【解决方案6】:

              这没有简单的方法。我建议阅读this 文章。 您需要以编程方式拆分字符串。 sql中没有这个函数。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-01-23
                • 2014-05-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多