假设表A的结构如下:
id a1      a2      a3      a4      a5      a6      a7      a8
1 5 16 20 39 15 30 6 11
2 10 21 22 33 44 19 41 13
3 13 16 23 27 11 24 15 18
4 17 21 110 28 12 84 13 18
5 17 25 7 27 19 23 13 212
6 16 27 39 16 13 22 14 26
7 63 24 90 115 11 21 68 25
8 90 21 11 15 10 22 21 28
9 12 42 7 13 51 21 15 238
10 13 20 7 15 12 14 18 30我想查询排除含有7,11,20,30,42,50,68,110,238的记录,所得结果
记录如下:id a1      a2      a3      a4      a5      a6      a7      a8
2 10 21 22 33 44 19 41 13
6 16 27 39 16 13 22 14 26需要说明的是:查询排除含有7,11,20,30,42,50,68,110,238记录的
条件是不定的,我有可能根据需要重设其它的条件。如查询排除含有8,18,
23,10,44,43,17的记录。这样,就需要写一个功能块来实现。避免在查询
分析器的窗口中进行烦琐的输入。存储过程+参数1+参数2+的方案不知可不可行?请哪位这方面的编写高手帮一忙,在下万分感谢,谢谢!

解决方案 »

  1.   

    declare @a table(id int, a1 int,a2 int,a3 int,a4 int,a5 int,a6 int,a7 int,a8 int)
    insert @a select 1,5,16,20,39,15,30,6,11
    union all select 2,10,21,22,33,44,19,41,13
    union all select 3,13,16,23,27,11,24,15,18
    union all select 4,17,21,110,28,12,84,13,18
    union all select 5,17,25,7,27,19,23,13,212
    union all select 6,16,27,39,16,13,22,14,26
    union all select 7,63,24,90,115,11,21,68,25
    union all select 8,90,21,11,15,10,22,21,28
    union all select 9,12,42,7,13,51,21,15,238
    union all select 10,13,20,7,15,12,14,18,30
    declare @s varchar(100)
    set @s='7,11,20,30,42,50,68,110,238'
    declare @t table(id int identity(1,1),a int)
    insert @t select top  100 0 from syscolumnsselect aa.* from @a aa left join
    (select distinct a.id from @a a
    ,(
    select substring(@s+',',id,charindex(',',@s+',',id)-id) x
    from @t a
    where substring(','+@s,id,1)=','
    )b
    where charindex(','+x+',',','+ltrim(a1)+','+ltrim(a2)+','+ltrim(a3)+','+ltrim(a4)+','+ltrim(a5)+','+ltrim(a6)+','+ltrim(a7)+','+ltrim(a8)+',')>0
    )bb
    on aa.id=bb.id where bb.id is null--result
    /*id          a1          a2          a3          a4          a5          a6          a7          a8          
    ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
    2           10          21          22          33          44          19          41          13
    6           16          27          39          16          13          22          14          26(所影响的行数为 2 行)
    */
      

  2.   

    declare @a table(id int, a1 int,a2 int,a3 int,a4 int,a5 int,a6 int,a7 int,a8 int)
    insert @a select 1,5,16,20,39,15,30,6,11
    union all select 2,10,21,22,33,44,19,41,13
    union all select 3,13,16,23,27,11,24,15,18
    union all select 4,17,21,110,28,12,84,13,18
    union all select 5,17,25,7,27,19,23,13,212
    union all select 6,16,27,39,16,13,22,14,26
    union all select 7,63,24,90,115,11,21,68,25
    union all select 8,90,21,11,15,10,22,21,28
    union all select 9,12,42,7,13,51,21,15,238
    union all select 10,13,20,7,15,12,14,18,30select id,line=rtrim(a1)+','+rtrim(a2)+','+rtrim(a3)+','+rtrim(a4)+','+rtrim(a5)+','+rtrim(a6)+','+rtrim(a7)+','+rtrim(a8) into #t from @adeclare @a1 int
    declare @a2 int
    declare @a3 int
    declare @a4 int
    set @a1=5
    set @a2=17
    set @a3=12
    set @a4=7
    select * from @a a where not exists( select 1 from (
    select id from #t where charindex(','+cast(@a1 as varchar)+',',','+line+',')>0 or charindex(','+cast(@a2 as varchar)+',',','+line+',')>0 or charindex(','+cast(@a3 as varchar)+',',','+line+',')>0 or charindex(','+cast(@a4 as varchar)+',',','+line+',')>0
    ) t where t.id=a.id
    )
    drop table #t
    /*(所影响的行数为 10 行)
    (所影响的行数为 10 行)id          a1          a2          a3          a4          a5          a6          a7          a8          
    ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
    2           10          21          22          33          44          19          41          13
    3           13          16          23          27          11          24          15          18
    6           16          27          39          16          13          22          14          26
    7           63          24          90          115         11          21          68          25
    8           90          21          11          15          10          22          21          28(所影响的行数为 5 行)
    */
      

  3.   


    create table #(id int, a1 int,a2 int,a3 int,a4 int,a5 int,a6 int,a7 int,a8 int)
    insert # select 1,5,16,20,39,15,30,6,11
    union all select 2,10,21,22,33,44,19,41,13
    union all select 3,13,16,23,27,11,24,15,18
    union all select 4,17,21,110,28,12,84,13,18
    union all select 5,17,25,7,27,19,23,13,212
    union all select 6,16,27,39,16,13,22,14,26
    union all select 7,63,24,90,115,11,21,68,25
    union all select 8,90,21,11,15,10,22,21,28
    union all select 9,12,42,7,13,51,21,15,238
    union all select 10,13,20,7,15,12,14,18,30
    select id,cast(a1 as varchar)+','+cast(a2 as varchar) +','+cast(a3 as varchar) +','+cast(a4 as varchar) +','+cast(a5 as varchar) +','+cast(a6 as varchar) +','+cast(a7 as varchar) +','+cast(a8 as varchar)as aa
    into #t
    from #
    declare @s varchar(100)
    set @s='7,11,20,30,42,50,68,110,238'create table #t2(name varchar(100))
    insert into #t2
    select @sselect top 1000 id=identity(int,1,1) into #t1 from sysobjects ,syscolumnsselect 
    [name]=substring(a.name,b.id,charindex(',',a.name+',',b.id)-b.id)
    into #t3
    from #t2 a ,#t1 b
    where substring(','+a.name,b.id,1)=',' select * from #
    where id
    not in
    (
    select  distinct a.id  from #t a, #t3 b
    where charindex(','+b.name+',',','+a.aa+',')>0
    )/*
    id          a1          a2          a3          a4          a5          a6          a7          a8          
    ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
    2           10          21          22          33          44          19          41          13
    6           16          27          39          16          13          22          14          26(所影响的行数为 2 行)*/