我要查找一个表里某个字段是否存在值.这个字段是nvarchar格式.存储的值比如 1,234,2589 就是一个数字字符串,由,间隔.有一个表值函数可以分解这个字符串成表SELECT * FROM dbo.f_Split('1,234,2589',',') 会分解成col
----------
1
234
2589(3 行受影响)
SELECT * FROM InnerNotice
WHERE Status=1
AND 
234 IN 
(
SELECT * FROM dbo.f_Split(InnerNotice.ReciveManagerType,',')

上面会报错,
消息 102,级别 15,状态 1,第 5 行
'.' 附近有语法错误。

解决方案 »

  1.   

    SELECT * FROM InnerNotice
    WHERE Status=1
    AND charindex(InnerNotice.ReciveManagerType,'234') > 0不使用拆分行可以吗?
      

  2.   

    SELECT * FROM InnerNotice 
    WHERE Status=1 
    AND 
    234 IN 

        SELECT * FROM dbo.f_Split([InnerNotice.ReciveManagerType],',') 
      

  3.   


    --
    charindex 这个方法有误的.比如 12,34,56 如果查找1就会找到.但其实1是不符合条件的.只有12才符合
      

  4.   

    --
    消息 102,级别 15,状态 1,第 5 行
    'InnerNotice.ReciveManagerType' 附近有语法错误。
      

  5.   

    SELECT * FROM InnerNotice  
    WHERE Status=1  
    AND 
    234 IN 
    (  
        SELECT * FROM dbo.f_Split(ReciveManagerType,',')  
    )这个呢?
      

  6.   


    --消息 321,级别 15,状态 1,第 5 行
    "ReciveManagerType" 不是可识别的表提示选项。如果它要作为表值函数的参数,请确保您的数据库兼容模式设置为 90。
      

  7.   

    SELECT a.* FROM InnerNotice As a
         Cross apply (Select * from dbo.f_Split(a.InnerNotice.ReciveManagerType,',')) As b On a.234=b.col
    WHERE a.Status=1
      

  8.   

    这样呢!
    lz的问题是select 出来的结果,无法跟之前的select ...in(...)构成可解析的tsql语句。
    可以使用动态拼接处理。如下DECLARE @sql NVARCHAR(2000)
    SET @sql = 
    'SELECT * FROM InnerNotice WHERE Status=1 AND 234 IN ('+InnerNotice.ReciveManagerType+')'
    EXEC(@sql)
      

  9.   

    找到一个替代的好办法:在值前后都加上,界这 如 ',12,234,768,' 
    SELECT * FROM InnerNotice
    WHERE Status=1
    AND charindex(',234,',ReciveManagerType) > 0
    这样就能准确判断
      

  10.   

    InnerNotice.ReciveManagerType前面和后面也有连接‘,’,不然开头和结尾的会找不到
      

  11.   

    SELECT * FROM InnerNotice
    WHERE Status=1
    AND charindex(','+InnerNotice.ReciveManagerType+',',','+'234'+',') > 0