救证一句很简单但是不寻常的语句

zhlym 2007-03-19 12:10:50
如下 in 用法是正确的

select * from 数据表 where 字段名 in('值1','值2','值3')

假如

CREATE PROCEDURE [dbo].[Mater]
(
@Start nvarchar(100)
)
AS
select * from 数据表 where 字段名 in(@Start)
GO

而 '值1','值2','值3' 是作为传入值给@Start的参数,如何让select语句正常查询出正确的结果?
...全文
235 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mengmou 2007-03-19
  • 打赏
  • 举报
回复
--创建测试环境,假设下列表中的数据都已经按照公司、产品汇总,即公司、产品是主键。
create table Info(Code int,IncDes varchar(10))
create table MaInfo(Code int,Barcode varchar(10),MaterialsCn varchar(10),number int)
create table SaleDetail(Code int,Barcode varchar(10),MaterialsCn varchar(10),sellnum1 int)
create table SaleOrder(Code int,Barcode varchar(10),MaterialsCn varchar(10),sellnum2 int)

--插入测试数据
insert Info(Code,IncDes)
select '1009','天染公司' union all
select '1005','海丰公司' union all
select '1023','采诗公司'

insert MaInfo(Code,Barcode,MaterialsCn,number)
select '1009','1111111','可口可乐','10' union all
select '1009','1111112','芬达可乐','12' union all
select '1009','1111113','花生果','15' union all
select '1005','1111112','芬达可乐','20' union all
select '1005','1111114','出前一丁','30' union all
select '1023','1111112','芬达可乐','22' union all
select '1005','1111113','花生果','40'

insert SaleDetail(Code,Barcode,MaterialsCn,sellnum1)
select '1009','1111111','可口可乐','2' union all
select '1005','1111114','出前一丁','3' union all
select '1023','1111112','芬达可乐','1'

insert SaleOrder(Code,Barcode,MaterialsCn,sellnum2)
select '1009','1111111','可口可乐','2' union all
select '1023','1111112','芬达可乐','1'

--求解过程
declare @ztdm varchar(20)
set @ztdm = '''1005'',''1009'''
exec('
declare @sql varchar(8000)
select @sql = ''select barcode,MaterialsCn ''


select @sql = @sql + '',sum(case when IncDes = '''''' + IncDes
+ '''''' then sellnum else 0 end) as '' + IncDes + ''销量''
+ '',sum(case when IncDes = '''''' + IncDes
+ '''''' then number else 0 end) as '' + IncDes + ''库存''
from info where convert(varchar(20),code) in ('+@ztdm+')

select @sql = @sql + '',sum(sellnum) as 总销量,sum(number) as 总库存
from (
select _m.code,_i.IncDes,_m.barcode,_m.MaterialsCn
,min(number) as number,isnull(sum(num),0) as sellnum
from MaInfo _m
full join(
select Code,Barcode,MaterialsCn,sellnum1 as num
from SaleDetail
union all
select Code,Barcode,MaterialsCn,sellnum2
from SaleOrder
) _s on _s.code = _m.code and _s.barcode = _m.barcode
join info _i on _i.code = _m.code
group by _m.code,_m.barcode,_m.MaterialsCn,_i.IncDes) _x
group by barcode,MaterialsCn order by barcode''

exec(@sql)
')

--删除测试环境
drop table Info,MaInfo,SaleDetail,SaleOrder

/*--测试结果
barcode MaterialsCn 天染公司销量 天染公司库存 海丰公司销量 海丰公司库存 总销量 总库存
1111111 可口可乐 4 10 0 0 4 10
1111112 芬达可乐 0 12 0 20 2 54
1111113 花生果 0 15 0 40 0 55
1111114 出前一丁 0 0 3 30 3 30

*/
zhlym 2007-03-19
  • 打赏
  • 举报
回复
呵。呵。。给 mengmou 大麻烦了,非常感谢
mengmou 2007-03-19
  • 打赏
  • 举报
回复
如改原来的语句麻烦吗?
-----
主要就是单引号的问题,开始是一个变两个,现在是一个变4个?
我正在测试,脑子都有点乱了。
zhlym 2007-03-19
  • 打赏
  • 举报
回复
mengmou 兄

由于我目前就缺 字段名 in('值1','值2','值3' ) 这样的用法无法正常使查询到的结果不对,我也试了把 '值1','值2','值3' 插入到第三方表里,然后 字段名 in(select code form 表)还是查询不到正确的结果,特还麻烦帮想想办法,如改原来的语句麻烦吗?
mengmou 2007-03-19
  • 打赏
  • 举报
回复
--这种情况应该用动态sql
CREATE PROCEDURE [dbo].[Mater]
(
@Start nvarchar(100)
)
AS
exec('select * from 数据表 where 字段名 in('+@Start+')')
--这句话相当于select * from 数据表 where 字段名 in('值1','值2','值3' )
GO

--但是,你那个sql已经是动态的了,如果再这样写的话就是
exec('exec(''……'')')
这样的话,你那个存储过程又要改了。
marco08 2007-03-19
  • 打赏
  • 举报
回复
CREATE PROCEDURE [dbo].[Mater]
(
@Start nvarchar(100)
)
AS
exec('select * from 数据表 where 字段名 in('+@Start+')')
GO
zhlym 2007-03-19
  • 打赏
  • 举报
回复
感谢marco08和mengmou的帮助

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧