【问题标题】:Split sql parameter on comma用逗号分割 sql 参数
【发布时间】:2013-12-09 07:14:07
【问题描述】:

以下代码适用于“Main Stream”或“Premium”作为参数,但我试图使其对它们都适用,如下所示,但它不返回任何结果。我怎样才能使下面的代码工作?

declare @myParameter varchar(50)
SET @myParameter = 'Main Stream , Premium'


select * FROM sales  
where myCategory IN (@myParameter)

【问题讨论】:

标签: tsql sql-server-2005


【解决方案1】:

你可以试试

--Split
DECLARE @textXML XML
DECLARE @data NVARCHAR(MAX), 
        @delimiter NVARCHAR(5)
        
SELECT  @data = 'Main Stream , Premium',
        @delimiter = ','
        
SELECT    @textXML = CAST('<d>' + REPLACE(@data, @delimiter, '</d><d>') + '</d>' AS XML)
SELECT  T.split.value('.', 'nvarchar(max)') AS data
FROM    @textXML.nodes('/d') T(split)

您可以将其存储在临时表中,也可以在 IN 子句中使用它。

对于@Hoy 的评论

你可以看看nodes() Method (xml Data Type)

nodes() 方法在您想要分解 xml 数据类型时很有用 实例到关系数据中。它允许您识别节点 将映射到新行。

另外,看看xml Data Type Methods

你可以把它当作

select * 
FROM    sales  
where   myCategory IN   (
                            SELECT  T.split.value('.', 'nvarchar(max)')
                            FROM    @textXML.nodes('/d') T(split)
                        )

【讨论】:

  • 嗨,我花了一些时间试图理解代码,我无法理解最后 2 行是如何工作的,什么是 (T),那个语法是什么?我应该用谷歌搜索什么来学习这种语法?最后如何使用带有 IN 子句的代码
【解决方案2】:

尝试:

select id from dbo.split("24,25,26",',');

所以你需要:

select * FROM sales  
where myCategory IN ( select id from dbo.split(@myParameter,",");

并通过运行在您的数据库中添加拆分功能:

Create FUNCTION [Split](@String varchar(8000), @Delimiter char(1))       
 returns @temptable TABLE (id varchar(8000))       
 as       
  begin       
      declare @idx int       
      declare @slice varchar(8000)       

      select @idx = 1       
          if len(@String)<1 or @String is null  return       

      while @idx!= 0       
      begin       
          set @idx = charindex(@Delimiter,@String)       
          if @idx!=0       
              set @slice = left(@String,@idx - 1)       
          else       
              set @slice = @String       

          if(len(@slice)>0)  
              insert into @temptable(id) values(@slice)       

          set @String = right(@String,len(@String) - @idx)       
          if len(@String) = 0 break       
      end   
  return       
  end
  Go

【讨论】:

    【解决方案3】:

    我在another thread on SO 上找到了类似问题的一个很好的解决方案。
    基本上,它使用分隔符(在您的情况下为“,”)拆分字符串(在您的情况下为@MyParameter)。

    下面是调用函数的方式:

    declare @myParameter varchar(50)
    SET @myParameter = 'Main Stream,Premium'
    
    --this table will hold delimited values
    DECLARE @ParsedTable TABLE 
    (   
            [id] [int] NOT NULL,
            [content] [nvarchar](50) NULL
    )
        --Parsing @myParameter
    INSERT INTO @ParsedTable
    SELECT * from [dbo].[SplitString](@myParameter, ',')
    --SELECT * FROM @ParsedTable --This will show you the values... 
    --run the query 
    select * FROM sales  
    where myCategory IN (SELECT content from @ParsedTable)
    

    这里是创建拆分函数的代码:

    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SplitString]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
    DROP FUNCTION [dbo].[SplitString]
    go
    
    /****** Object:  UserDefinedFunction [dbo].[SplitString]    Script Date: 11/04/2013 19:04:05 ******/
    SET ANSI_NULLS ON
    go
    
    SET QUOTED_IDENTIFIER ON
    go
    
    CREATE FUNCTION [dbo].[SplitString] 
    (
        -- Add the parameters for the function here
        @StringToDelimit nvarchar(500),
        @deliminator nvarchar(2)
    )
    RETURNS 
    @ReturnTable TABLE 
    (
        -- Add the column definitions for the TABLE variable here
        [id] [int] IDENTITY(1,1) NOT NULL,
        [content] [nvarchar](50) NULL
    )
    AS
    BEGIN
            Declare @delimitorIdx int
            Declare @content varchar(50)
    
            --initialize spaces
            Select @delimitorIdx = charindex(@deliminator,@StringToDelimit,0)
            While @delimitorIdx > 0
    
            Begin
                Select @content = substring(@StringToDelimit,0,charindex(@deliminator,@StringToDelimit,0))
    
                Insert Into @ReturnTable(content)
                Select @content
    
                Select @StringToDelimit = substring(@StringToDelimit,charindex(@deliminator,@StringToDelimit,0)+ 1,len(@StringToDelimit) - charindex(' ',@StringToDelimit,0))
    
                Select @delimitorIdx = charindex(@deliminator,@StringToDelimit,0)
            end
    
            If len(@StringToDelimit) > 0
                Insert Into @ReturnTable
                Select @StringToDelimit
    
        RETURN 
    END
    
    go
    

    【讨论】:

      【解决方案4】:
      declare @myParameter varchar(50)
      SET @myParameter = 'Main Stream , Premium'
      
      
      select * FROM sales  
      where myCategory IN (select * from string_split(@myParameter,','))
      

      【讨论】:

        猜你喜欢
        • 2021-03-13
        • 1970-01-01
        • 2013-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-03-18
        • 1970-01-01
        • 2020-08-30
        相关资源
        最近更新 更多