问题一:create table duizhao
(
id      int identity(1,1) ,
zyid    varchar(10),
zyname  varchar(10),
gsid     varchar(10),
gsnames  varchar(10)
)insert into duizhao select              '001',     'aaa',             '100',       'aaab'
union all select      '001',     'aaa',             '101',       'aaac'
union all select      '001',     'aaa',             '102',       'aaad'
union all select      '002',     'bbb',             '103',       'bbbc'
union all select      '002',     'bbb',             '104',       'bbbf'
union all select      '003',     'ccc',             '105',       'cccs'
union all select      '004',     'ddd',             '106',       'dddf'
union all select      '005',     'eee',             '107',       'eees'
union all select      '006',     'fff',             '108',       'fffs'
union all select      '006',     'ggg',             '109',       'ggsd'create table t_login
(
id       int ,
gsid     varchar(10),
公司名称   varchar(10),
用户名      varchar(10),
查询范围   varchar(100)
)insert into t_login  select 21,       '100',         'aaab',    'alibaba',   '100,103,106,107,109'select * from duizhao 
select * from t_login 
select a.gsid 
from duizhao a 
join 
(
select zyid 
from duizhao d
join t_login on  查询范围 like '%'+d.gsid +'%'
) t on a.zyid = t.zyid 
gsid       
---------- 
100
101
102
103
104
106
107
108
109(所影响的行数为 9 行)

解决方案 »

  1.   

    1. trydeclare @user varchar(100)
    set @user='alibaba'select gsid from duizhao
    where zyid in (select zyid from duizhao  a
                            inner join t_login b
                             on  charindex(','+a.gsid+',' ,','+b.[查询范围]+',' )>0
                             and b.[用户名]=@user
                             )
      

  2.   

    select 1 from t_login
    where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0-----------------
    能不能解释一下这句的作用是什么?或是没有左右?
      

  3.   

    如果这句的意思主要还是为了查询他的父公司名称的话,那么这个查询则没有什么意义!
    而且
    101     aaab          asrock      2007-01-07     2007-02-08      400          300
    102     aaad          ds          2007-01-05     2007-03-05      600          550
    以上数据,公司名称和id与表duizhao不一致.
      

  4.   

    2. trydeclare @company varchar(200),@start datetime,@end datetimeselect T1.公司名称, sum(T2. 批复金额) as [借款额]
    from   (select * from  shenp
                 union all
                   select * from v_shenp
                 )   T1
    inner join 
    (select A.gsid ,sum(A.批复金额) as 批复金额
      from 
          (select * from  shenp
            union all
            select * from v_shenp
           ) A
      where (charindex(','+rtrim(A.gsid)+',' ,','+@company+',')>0  or  isnull(@company,'')='0')
      and  A.批复日期 >=isnull(@start,'1900-01-01')
      and  A.批复日期<=isnull(@end,'2999-01-01')
      and A.审批意见='同意'
      group by A.gsid)  T2
    on T1.gsid=T2.gsid
    group by T1.公司名称
      

  5.   

    --沒有測試,隨手寫的可能有誤,--1. trydeclare @user varchar(100)
    set @user='alibaba'select gsid from duizhao
    where zyid in (select zyid from duizhao  a
                            inner join t_login b
                            on  charindex(','+rtrim(a.gsid)+',' ,','+b.[查询范围]+',' )>0
                             and b.[用户名]=@user
                             )--2.trydeclare @company varchar(200),@start datetime,@end datetimeselect T1.公司名称, sum(T2. 批复金额) as [借款额]
    from   (select * from  shenp
                 union all
                   select * from v_shenp
                 )   T1
    inner join 
    (select A.gsid ,sum(A.批复金额) as 批复金额
      from 
          (select * from  shenp
            union all
            select * from v_shenp
           ) A
      where (charindex(','+rtrim(A.gsid)+',' ,','+@company+',')>0  or  isnull(@company,'')='0')
      and  A.批复日期 >=isnull(@start,'1900-01-01')
      and  A.批复日期<=isnull(@end,'2999-01-01')
      and A.审批意见='同意'
      group by A.gsid)  T2
    on T1.gsid=T2.gsid
    group by T1.公司名称
      

  6.   

    问题一:
    declare @username varchar(10)
    set @username='alibaba'
    select * from duizhao where zyid in (select zyid from duizhao a,t_login b  where charindex(','+a.gsid+',',','+b.查询范围+',')>0)
      

  7.   

    小问题二:--exec test_zjreport_release '0'
    create proc test_zjreport_release
    (
    @companyname varchar(1000)=null,
    @startdate datetime=null,
    @enddate datetime=null
    )
    as 
    begin select 公司名称 ,sum(申请用款总额) as 借款额 
    from 
    (
    select 公司id,公司名称,sum(批复金额) as 申请用款总额 
    from 
    (
     select * from shenp
     union all
     select * from v_shenp
    ) t
    where 审批意见='同意'  --不知道你的审批意见这一列从哪里来的?
    and (@companyname is null or @companyname ='0' 
    or 公司id in 
    (select a.gsid 
    from duizhao a 
    join 
    (
    select zyid 
    from duizhao d
    join t_login on  查询范围 like '%'+d.gsid +'%'
    ) t on a.zyid = t.zyid )
    and  A.批复日期 >=isnull(@start,'1900-01-01')
    and  A.批复日期 <=isnull(@end,'2999-01-01')
    group by 公司id,公司名称
    ) a 
    group by 公司名称end 没有测试过,不过对于楼主你给的数据和例子都有问题...
    建议:需要细心
      

  8.   


    问题二:我觉得使用存储过程结合游标可以实现,可能效率比较低的
    我没有测试过,自己去试试吧create proc T
    as 
    begin  DECLARE @cdbname varchar(15),@fa int 
    declare @t table (FFrameWorkID int ,cdbname varchar(100),cacc_name varchar(50),FDatabaseLocation varchar(10),fa int)

    insert into @t FFrameWorkID ,cdbname,cacc_name,FDatabaseLocation
    select  DISTINCT FFrameWorkID ,cdbname,cacc_name,FDatabaseLocation
    from master.dbo.aaa 
    join bbb.dbo.t_GR_FrameWork 
    on master.dbo.aaa.cacc_name= bbbdbo.t_GR_FrameWork.FK3DataSourceName DECLARE ak47_cursor CURSOR FOR 
    select cdbname
    from @t OPEN ak47_cursor

    FETCH NEXT FROM ak47_cursor 
    INTO @cdbname

    WHILE @@FETCH_STATUS = 0
    BEGIN

    sp_executesql 'select @fa = fa from '+@cdbname+'.dbo.t_itemclass where t_itemclassid=4 ',N'@fa int output ',@fa output 

    update a set fa = @fa 
    from @t a 
    where cdbname =@cdbname 


    FETCH NEXT FROM ak47_cursor 
    INTO @cdbname

    END
    CLOSE ak47_cursor
    DEALLOCATE ak47_cursorselect * from @t 
    end 
      

  9.   

    先看楼上大哥的 问题2:
    ---------------------------------------------------
    服务器: 消息 170,级别 15,状态 1,过程 T,行 8
    第 8 行: 'FFrameWorkID' 附近有语法错误。
    服务器: 消息 170,级别 15,状态 1,过程 T,行 26
    第 26 行: 'sp_executesql' 附近有语法错误。
    服务器: 消息 156,级别 15,状态 1,过程 T,行 43
    在关键字 'end' 附近有语法错误。
      

  10.   

    playwarcraft(时间就像乳沟,挤挤还是有的) 
    老大的解法会出现二个问题1:用户无输入参数时结果集为空值 2.统计数据不正确,可能还是我的表达有问题,郁闷!
    xiaoku(野蛮人(^v^)) 
    老大的解法也有上面的问题关于问题2的解决思路我了解了,语法检查有些问题,我再试看看!
    ===============================唉,其实在我的语句基础上修改才是最好的办法,因为这个破东西涉及东西太多,而我又讲不清,可是..........唉
      

  11.   

    CREATE   proc zjreport_release
       (
        @companyname varchar(1000)=null,
        @startdate datetime=null,
        @enddate datetime=null
        )
    as 
    begin
    select 公司名称zy as 公司名称,sum(申请用款总额) as 借款额 from 
    (
    select 公司id,公司名称,sum(批复金额) as 申请用款总额 
    from 
    (
     select * from v_shenp
     union all
     select * from shenp
    ) tt1
     where  审批意见='同意' 
    /* ----大家注意其实这个存储过程出问题的部份就这个加注释的中间的部份,而且case when @companyname is null or @companyname = 0 then gsid这一部份也是正常的,不正常的是else以后的--- */
    and 
    gsid  in (
    case when @companyname is null or @companyname = 0 then gsid else
    (select gsid from duizhao as tmp
    where exists
    (
    select * from duizhao as tmpA
    where exists
    (
    select 1 from t_login
    where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0
    ) and tmpA.zyid = tmp.zyid ))
    end )
    /* ------------------------------------------------------------ */
    and 请求时间>(case when @startdate is null then 请求时间-1 else @startdate end)
    and 请求时间<(case when @enddate is null then 请求时间+1 else @enddate end)
    group by 公司id,公司名称
    )tt ,duizhao aa where tt.公司id = aa.gsid group by 公司名称zy
    end
    GO
    大哥,从这个过程中下手解决一下好吗?
      

  12.   

    你上面的写法不对的吧
    case when XX then A
    else B 
    endA和B要同一类型的,这里你then后面是gsid而else后面是一个(select * from XX)的结果集.
    把gsid也换成结果集试下也可
      

  13.   

    问题二:create proc T
    as 
    begin  DECLARE @cdbname varchar(15),@fa int 
    declare @sql varchar(1000) --这里我重新定义了一个执行的sql语句变量
    declare @t table (FFrameWorkID int ,cdbname varchar(100),cacc_name varchar(50),FDatabaseLocation varchar(10),fa int)

    insert into @t ( FFrameWorkID ,cdbname,cacc_name,FDatabaseLocation) --这里之前没有 () 呵呵,我也粗心
    select  DISTINCT FFrameWorkID ,cdbname,cacc_name,FDatabaseLocation
    from master.dbo.aaa 
    join bbb.dbo.t_GR_FrameWork 
    on master.dbo.aaa.cacc_name= bbbdbo.t_GR_FrameWork.FK3DataSourceName DECLARE ak47_cursor CURSOR FOR 
    select cdbname
    from @t OPEN ak47_cursor

    FETCH NEXT FROM ak47_cursor 
    INTO @cdbname

    WHILE @@FETCH_STATUS = 0
    BEGIN

    set @sql ='select @fa = fa from '+ @cdbname +'.dbo.t_itemclass where t_itemclassid=4 '
    exec sp_executesql @sql,N'@fa int output ',@fa output  --估计之前这个函数不应许语句中间使用变量

    update a set fa = @fa 
    from @t a 
    where cdbname =@cdbname 


    FETCH NEXT FROM ak47_cursor 
    INTO @cdbname

    END
    CLOSE ak47_cursor
    DEALLOCATE ak47_cursorselect * from @t 
    end 
    --我分析查询了以下 成功!
      

  14.   

    to:lz是仔细检查一下你给我们的测试数据是否也有误呢?
    感觉,语句是没有问题!
      

  15.   

    xiaoku(野蛮人(^v^)) ===================
    谢谢老大的指点,语句检查无误,但执行出了点小问题:(所影响的行数为 6 行)服务器: 消息 214,级别 16,状态 2,过程 sp_executesql,行 28
    过程需要参数 '@statement' 为 'ntext/nchar/nvarchar' 类型。
    看样子说明出结果了,但是还有这个错误,不太清楚,没有这方面的经验,正在查资料
      

  16.   

    你上面的写法不对的吧
    case when XX then A
    else B 
    endA和B要同一类型的,这里你then后面是gsid而else后面是一个(select * from XX)的结果集.
    把gsid也换成结果集试下也可
    +++++++++++++++++++++++
    playwarcraft(时间就像乳沟,挤挤还是有的)
    老大,我明白你的意思了,但是不清楚要如何把gsid也换成结果集,这个还要如何换呢?
      

  17.   

    是你的sp_executesql 语句里面没有 定义@statement 这个变量?
    把语句贴出来看看?
      

  18.   

    我试过把gsid也换成结果集了,然后执行@companyname的条件为NULL或是为0,以便于让语句执行这个新加的结果集,但是会出现错误:
    服务器: 消息 512,级别 16,状态 1,过程 zjreport_release,行 12
    子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
    存储过程: sms.dbo.zjreport_release
    返回代码 = -6
      

  19.   

    xiaoku(野蛮人(^v^)) ===================
    我是COPY你的代码来的
      

  20.   

    xiaoku(野蛮人(^v^)) ===================老大,知道了,是这里的问题declare @sql nvarchar(4000) 原来是varchar(8000),改为nvarchar就可以了
      

  21.   

    问题2:shenp与v_shenp表的表结构相同,分别为上半年数据和下半年数据,现在需要一个存储过程实现:按照公司(也就是gsid)
    进行分组求合的数据报表,得出每一个公司按输入日期或是全年的统计数据,这个存储过程有三个参数,一个是@companyname,输入
    参数的形式是如215,125,455之类,或是为null 或是为0,为NULL或是为0,则查询全部公司的“批复金额”的汇总数据,如果
    为具体的数组,则会按照问题1的需求逻辑将输入的数组进行处理,将得出的公司的数据按gsid进行分组,
    @startdate指开始时间(指的是“批复日期”字段) @enddate是结束时间,也就是用户可以指定一个时间段进行查询全部或是某一个
    或是某几个公司的“批复金额”汇总数据,需要特别指出的是这三个参数都有为空或不为空的时侯。
    -----------------
    这个搞定了没有?
      

  22.   

    这个其实已经搞定了,就是这一段:
    (select gsid from duizhaobiao as tmp
    where exists
    (
    select * from duizhaobiao as tmpA
    where exists
    (
    select 1 from t_userlogin
    where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0
    ) and tmpA.zyid = tmp.zyid ))只是把它加入case when 中就出错
      

  23.   

    其实在 where 中使用 case 看起来都不舒服!
    我宁愿使用 or
      

  24.   

    xiaoku(野蛮人(^v^)) 
    +++++++++++++++++++++++问题二还有些问题:
    执行可以正常执行了,但是fa字段的值都是NULL
    并且会有错误提示:(所影响的行数为 6 行)服务器: 消息 208,级别 16,状态 1,行 1
    对象名 '006.dbo.t_itemclass' 无效。(所影响的行数为 0 行)服务器: 消息 208,级别 16,状态 1,行 1
    对象名 '005.dbo.t_itemclass' 无效。(所影响的行数为 0 行)服务器: 消息 208,级别 16,状态 1,行 1
    对象名 '004.dbo.t_itemclass' 无效。(所影响的行数为 0 行)服务器: 消息 208,级别 16,状态 1,行 1
    对象名 '003.dbo.t_itemclass' 无效。(所影响的行数为 0 行)服务器: 消息 208,级别 16,状态 1,行 1
    对象名 '002.dbo.t_itemclass' 无效。(所影响的行数为 0 行)服务器: 消息 208,级别 16,状态 1,行 1
    对象名 '001.dbo.t_itemclass' 无效。(所影响的行数为 0 行)
    (所影响的行数为 6 行)存储过程: master.dbo.T
    返回代码 = 0
      

  25.   

    set @sql ='select @fa = fa from  '+ @cdbname +'.dbo.t_itemclass where t_itemclassid=4 '--如果是 null的问题 的话,加个判断: set @sql ='select @fa = isnull(fa,0) from  '+ @cdbname +'.dbo.t_itemclass where t_itemclassid=4 '
      

  26.   

    但问题是实际如果单独执行每一个数据库实体
    select fa from cdbname.dbo.t_itemclass where t_itemclassid='4'是有结果的啊
      

  27.   

    问题原因找到了,这个cdbname的值,比如说是:AIS20070124000700,但从错误提示中给出的则会是AIS200701240007,也就是说每一个数据库实体名都比实际的少二位,我把cdbname(varchar 100) 变成了varchar(400)也会有这个问题
      

  28.   

    cao,老大,这回真的是解决了
    DECLARE @cdbname varchar(15)
    原来你定义的是15,结果比我们真实的少了二位,改成17,OK了!
      

  29.   

    这个其实已经搞定了,就是这一段:
    (select gsid from duizhaobiao as tmp
    where exists
    (
    select * from duizhaobiao as tmpA
    where exists
    (
    select 1 from t_userlogin
    where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0
    ) and tmpA.zyid = tmp.zyid ))只是把它加入case when 中就出错
    就是我那个存储过程啊
      

  30.   

    当输入的@companyname 不为空时如125,15,54,49 这种类型时,就会报错:
    服务器: 消息 245,级别 16,状态 1,过程 zjreport_release,行 10
    将 varchar 值 '125,415' 转换为数据类型为 int 的列时发生语法错误。
    @companyname 为NULL 或是为 o 时正常执行
      

  31.   

    或是如果不用判断@companyname是否为空而直接用
    and 
    gsid  in (
    ----------------------------------------------
    (select gsid from duizhao as tmp
    where exists
    (
    select * from duizhao as tmpA
    where exists
    (
    select 1 from t_login
    where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0
    ) and tmpA.zyid = tmp.zyid ))
     )
    /* ------------------------------------------------------------ */
    也是可以正常执行的,不知我这样描述能不能看懂
      

  32.   

    and 
    gsid  in (
    case when @companyname is null or @companyname = 0 then gsid else
    (select gsid from duizhao as tmp
    where exists
    (
    select * from duizhao as tmpA
    where exists
    (
    select 1 from t_login
    where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0   
    ) and tmpA.zyid = tmp.zyid ))
    end )------------
    oh 前面已经有同志说明了,case when 之后的两个数据是相同类型的,而你不是!改改...不使用case when 
      

  33.   

    and (@companyname is null or @companyname = 0 or gsid  in 
    (select gsid from duizhao as tmp
    where exists
    (
    select * from duizhao as tmpA
    where exists
    (
    select 1 from t_login
    where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0
    ) and tmpA.zyid = tmp.zyid )
    )
    )
    )
      

  34.   

    报告老大,还是这个问题:
    服务器: 消息 245,级别 16,状态 1,过程 zjreport_release,行 10
    将 varchar 值 '125,254' 转换为数据类型为 int 的列时发生语法错误。
      

  35.   

    and gsid  in (
    (select gsid from duizhaobiao as tmp
    where exists
    (
    select * from duizhaobiao as tmpA
    where exists
    (
    select 1 from t_userlogin
    where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0
    ) and tmpA.zyid = tmp.zyid )
    )
    )
    --or  @companyname is null or @companyname = 0 注释掉最后一句不会报错,加上就报错!但分开的这两段是可以执行的
      

  36.   

    and (@companyname is null or @companyname = '0' or gsid  in   --把 0 给高程字符行不?
    (select gsid from duizhao as tmp
    where exists
    (
    select * from duizhao as tmpA
    where exists
    (
    select 1 from t_login
    where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0
    ) and tmpA.zyid = tmp.zyid )
    )
    )
    )