动态选择的一组字符串
如:字符串=‘a,b,c'
 需要查出表中栏目列中等于这些字符串号的记录
表A
  序号  栏目 
    1     a  
     2     b
    3     c
    4      d
    5       e
    6      f显示结果:
  序号  栏目 
    1     a  
     2     b
    3     c

解决方案 »

  1.   

    1.先写个表值函数  
    create function [dbo].[f_SplitToNvarchar]
    (
    @SourceSql nvarchar(max),--源分隔字符串
    @StrSeprate varchar(10)--分隔符
    )
    returns @temp table(a nvarchar(max))
    as  
    begin
      declare @i int
      set @SourceSql=rtrim(ltrim(@SourceSql))
      set @i=charindex(@StrSeprate,@SourceSql)
      while @i>=1
      begin
      insert @temp values(left(@SourceSql,@i-1))
      set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
      set @i=charindex(@StrSeprate,@SourceSql)
      end
      if @SourceSql<>'\'
      insert @temp values(@SourceSql)
      return  
    end2.然后  
     select * from A where 栏目 in (select * from f_SplitToNvarchar('a,b,c',',') 
      

  2.   

    select * from A where 栏目 in (select * from f_SplitToNvarchar('a,b,c',','))
      

  3.   

    创建函数的时候提示错误服务器: 消息 170,级别 15,状态 1,过程 f_SplitToNvarchar,行 3
    第 3 行: 'max' 附近有语法错误。
    服务器: 消息 137,级别 15,状态 1,过程 f_SplitToNvarchar,行 10
    必须声明变量 '@SourceSql'。
    服务器: 消息 137,级别 15,状态 1,过程 f_SplitToNvarchar,行 11
    必须声明变量 '@StrSeprate'。
    服务器: 消息 137,级别 15,状态 1,过程 f_SplitToNvarchar,行 14
    必须声明变量 '@temp'。
    服务器: 消息 137,级别 15,状态 1,过程 f_SplitToNvarchar,行 15
    必须声明变量 '@SourceSql'。
    服务器: 消息 137,级别 15,状态 1,过程 f_SplitToNvarchar,行 16
    必须声明变量 '@StrSeprate'。
    服务器: 消息 137,级别 15,状态 1,过程 f_SplitToNvarchar,行 18
    必须声明变量 '@SourceSql'。
    服务器: 消息 137,级别 15,状态 1,过程 f_SplitToNvarchar,行 19
    必须声明变量 '@temp'。
      

  4.   

    查询用到的函数 f_splitSET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GOCREATE   function   [dbo].[f_split](@c   varchar(5000),@split   varchar(2))   
    returns   @t   table(col   varchar(5000))   
    as   
        begin   
        declare @tmpstr varchar
        declare @index int
        set @index=1;
          while(charindex(@split,@c,@index)<>0)   
            begin   
              set @tmpstr=substring(@c,charindex(@split,@c,@index),charindex(@split,@c,@index))
              if(ascii(@tmpstr)<>163)
                  begin
                      insert   @t(col)   values   (substring(@c,1,charindex(@split,@c,@index)-1))  
                      set   @c   =   stuff(@c,1,charindex(@split,@c,@index),'')   
                      set @index=1
                  end
              else
                  begin
                      set @index=(charindex(@split,@c,@index)+1)
                  end 
            end   
          insert   @t(col)   values   (@c)   
          return   
        end   查询语句
    declare @str nvarchar(100)
    set @str='a,b,c'
    select * from A where 栏目 in (select * from f_split(@str,','))