东成西就

路漫漫兮 其修远兮 吾将上下而求索!

SQL Server中求子串位置的两个函数

 东成西就 14:59:44
曾哥,你好!
请教你一个问题,在存储过程中我有一个语句需要用到 in 子句(字符串),在Delphi中传值进行去,我使用Astr := Astr + ', ' + Format('''%s''', [Avalue])进行格式化,但是出来后好像SQL Server不接受哦!
 罩得住 15:04:12
hi,刚过来
 罩得住 15:04:45
也许出在Format上,你不用Format试试看
 东成西就 15:06:08
合成后的字符串为''00001', '00003'',这样传过去到后台
 罩得住 15:06:46
这个我知道,我是说,你能不能先用常量''001','002''试试,看能否接收参数
 东成西就 15:07:34
我试一下
 东成西就 15:09:57
我用'00001'传进去可以
 东成西就 15:10:17
我再试一下,'00001, 00003'
 罩得住 15:10:13
如果两个值呢?逗号是否是全角的啦?
 东成西就 15:23:33
传入多个值就不行啦
 东成西就 15:23:48
我在查询分析器里执行也没有结果
 罩得住 15:25:09
你试试半角的双引号,如:'"0001","0003"'
 罩得住 15:25:35
SQL中可以识别半角双引号
 东成西就 15:26:38
是吗?
 罩得住 15:26:28
试试看
 东成西就 15:28:50
一个行,多个就不行啦
 东成西就 15:29:09
我将存储过程写给你看吧
 罩得住 15:29:05
喔,好吧
 东成西就 15:30:58
ALTER  PROCEDURE dbo.uspGetWaterfees
(
  @AmeterID int,                          -- 水表编号
  @ARefID uniqueidentifier = null,        -- 引用标识
  @AWaterfeeStatecode varchar(256) = null -- 费用状态
)
AS
  SET NOCOUNT ON
  declare
    @Asql varchar(8000)
   
  if @ARefID is null
  begin
    if @AWaterfeeStatecode is null or (@AWaterfeeStatecode = '')
      select * from Waterfees where wfMeterID = @AmeterID order by wfBuilddate desc
    else
      if Patindex(',', @AWaterfeeStatecode) = 0 -- 只查询一种费用状态
        select *
          from Waterfees
          where wfMeterID = @AmeterID
            and wfWaterfeeStatecode = @AWaterfeeStatecode
          order by wfBuilddate desc
      else
      begin
        select @Asql = '
        select *
          from Waterfees
          where wfMeterID = ' + @AmeterID + '
            and wfWaterfeeStatecode in (' + @AWaterfeeStatecode + ')
          order by wfBuilddate desc'
        exec (@Asql)
      end
  end else
    if @AWaterfeeStatecode is null or (@AWaterfeeStatecode = '')
      select *
        from Waterfees
        where wfMeterID = @AmeterID and wfRefID = @ARefID
        order by wfBuilddate desc
    else
      if Patindex(',', @AWaterfeeStatecode) = 0 -- 只查询一种费用状态
        select *
          from Waterfees
          where wfMeterID = @AmeterID and wfRefID = @ARefID
            and wfWaterfeeStatecode = @AWaterfeeStatecode
            order by wfBuilddate desc
      else
        select *
          from Waterfees
          where wfMeterID = @AmeterID and wfRefID = @ARefID
            and wfWaterfeeStatecode in (@AWaterfeeStatecode)
            order by wfBuilddate desc
       
  SET NOCOUNT OFF
  RETURN
 
 罩得住 15:31:56
你传的是第几个参数?
 东成西就 15:32:51
        select @Asql = '
        select *
          from Waterfees
          where wfMeterID = ' + @AmeterID + '
            and wfWaterfeeStatecode in (' + @AWaterfeeStatecode + ')
          order by wfBuilddate desc'
        exec (@Asql)
问题出在这里,以前都是直接执行的
语句如下
  select *
   from Waterfees
    where wfMeterID = @AmeterID
      and wfWaterfeeStatecode in (@AWaterfeeStatecode)
    order by wfBuilddate desc

 
 东成西就 15:34:18
我是这样执行的
exec uspGetWaterfees 212500, null, '00001, 00003'
exec uspGetWaterfees 212500, null, '''00001'', ''00003'''
exec uspGetWaterfees 212500, null, '"00001", "00003"'
都没有结果
 东成西就 15:36:11
而如果这样直接在查询分析器里执行去可以
declare
  @Asql varchar(8000),
  @AWaterfeeStatecode varchar(256)
select @AWaterfeeStatecode = '00001, 00003',
  @Asql = '
        select *
          from Waterfees
          where wfMeterID = 212500
            and wfWaterfeeStatecode in (' + @AWaterfeeStatecode + ')
          order by wfBuilddate desc'
        exec (@Asql)
 
 罩得住 15:37:18
你试过这种没有
'''0001,0003'''
 东成西就 15:37:57
没有,我试试
 东成西就 15:38:20
也没有结果啊
 罩得住 15:40:05
where wfMeterID = 212500
            and wfWaterfeeStatecode in ("' + @AWaterfeeStatecode + '") order by wfBuilddate desc'

 
 罩得住 15:40:29
试试,不行的话,我就搞不懂了
 东成西就 15:40:53
我试试
 东成西就 15:43:09
不行,其实在SQL Server中字符串及整数型都可以进行隐式转换的啊,
不加"都可以直接执行
 罩得住 15:43:26
是啊,我真搞不懂了
 东成西就 15:45:51
我现在把这一句提出来单独放到一个存储过程中,看是不是条件判断语句上的逻辑出了问题
 罩得住 15:46:04
喔,先搞个简单的过程看看
 东成西就 15:59:26
子串错误,我使用的Patindex(',', @AWaterfeeStaetcode) = 0有误
 罩得住 16:01:25
是逗号的问题?
 东成西就 16:02:24
不是,而应该使用Charindex(',', @AWaterfeestatecode) = 0
 罩得住 16:02:55
不会吧,你又没用通配符,两个应该一样的
 东成西就 16:03:43
真的
 东成西就 16:04:06
是,帮助里都这样说啊,可是结果就不一样
 罩得住 16:03:45
换了之后,问题就解决啦?
 东成西就 16:04:12
YES
 罩得住 16:04:06
喔,奇怪啊
 东成西就 16:05:10
不得其解
 罩得住 16:05:28
呵呵,解决就行啦
 东成西就 16:05:59
谢啦

posted on 2005-02-27 16:09  东成西就  阅读(971)  评论(0)    收藏  举报

导航