目标表结构如下:
SysID 主键,自增identity(1,1)
CompanyID 外键,公司ID
ReportName 报表名称
Position 位置信息(类似excel中的a1这种格式)
Period 期间(如201010,为年份+月份)
Data 数值,money类型需求:
创建存储过程 输入参数@para1 ,@para2,输出参数 @para3 output
注:
@para1 的结构为 '公司ID.报表名称.位置.期间,公司ID.报表名称.位置.期间,公司ID.报表名称.位置.期间'
即 各列用.分隔而多个对象用,分隔的字符串
@para2 结构同 @para1
返回
@para3 = (@para1 里所有Data的和) - (@para1 里所有Data的和)请各位高手指点,在线等!
SysID 主键,自增identity(1,1)
CompanyID 外键,公司ID
ReportName 报表名称
Position 位置信息(类似excel中的a1这种格式)
Period 期间(如201010,为年份+月份)
Data 数值,money类型需求:
创建存储过程 输入参数@para1 ,@para2,输出参数 @para3 output
注:
@para1 的结构为 '公司ID.报表名称.位置.期间,公司ID.报表名称.位置.期间,公司ID.报表名称.位置.期间'
即 各列用.分隔而多个对象用,分隔的字符串
@para2 结构同 @para1
返回
@para3 = (@para1 里所有Data的和) - (@para1 里所有Data的和)请各位高手指点,在线等!
如:
declare @para3 money
exec procName
'1.资产负债表.11.201010,1.利润表.13.201010,2.资产负债表.11.201010,2.利润表.201010',
'4.资产负债表.11.201010,4.利润表.13.201010,5.资产负债表.11.201010,5.利润表.201010',
@para3 output
可以这么说。
就是@para1 里所有的data 减去 @para2 里所有data
创建存储过程 输入参数@para1 ,@para2,输出参数 @para3 output
注:
@para1 的结构为 '公司ID.报表名称.位置.期间,公司ID.报表名称.位置.期间,公司ID.报表名称.位置.期间'
即 各列用.分隔而多个对象用,分隔的字符串
@para2 结构同 @para1
返回
@para3 = (@para1 里所有Data的和) - (@para2 里所有Data的和)更正下,刚手误!
同一公司,同一报表,同一位置,同一期间的记录只有一条。
另外,我能不能把参数换下,
declare @para3 money
exec procName
'1.资产负债表.11.2010.10,1.利润表.13.2010.10,2.资产负债表.11.2010.10,2.利润表.2010.10',
'4.资产负债表.11.2010.10,4.利润表.13.2010.10,5.资产负债表.11.2010.10,5.利润表.2010.10',
@para3 output
注:
@para1 的结构为 '公司ID.报表名称.位置.年.月,公司ID.报表名称.位置.年.月,公司ID.报表名称.位置.年.月'
即 各列用.分隔而多个对象用,分隔的字符串
@para2 结构同 @para1即:
条件里的 期间 换成 年.月 而数据表里 期间 仍然为 年+月 ,就是 年*100+月
create proc proc_name
@para1 nvarchar(max),
@para2 nvarchar(max),
@para3 int output
as
begin
declare @s nvarchar(max)
set @s='select @para3=sum(Data) from(
select Data from tb where '+@para1 + 'union all
select -Data from tb where '+@para2+')t '
exec sp_executesql @s,N'@para3 int output',@para3 output
end
标题:分解字符串并查询相关数据
作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-03-18
地点:广东深圳
说明:通过使用函数等方法分解字符串查询相关数据。问题:通过分解一个带某种符号分隔的字符串在数据库中查找相关数据。
例如 @str = '1,2,3',查询下表得到记录1,4,5,6
ID TypeID
1 1,2,3,4,5,6,7,8,9,10,11,12
2 2,3
3 3,7,8,9
4 2,6
5 4,5
6 6,7
*/
-----------------------------
create table tb (ID int , TypeID varchar(30))
insert into tb values(1 , '1,2,3,4,5,6,7,8,9,10,11,12')
insert into tb values(2 , '2,3')
insert into tb values(3 , '3,7,8,9')
insert into tb values(4 , '2,6')
insert into tb values(5 , '4,5')
insert into tb values(6 , '6,7')
go
-----------------------------
--如果仅仅是一个,如@str = '1'.
declare @str as varchar(30)
set @str = '1'
select * from tb where charindex(',' + @str + ',' , ',' + TypeID + ',') > 0
select * from tb where ',' + TypeID + ',' like '%,' + @str + ',%'
/*
ID TypeID
----------- ------------------------------
1 1,2,3,4,5,6,7,8,9,10,11,12
(所影响的行数为 1 行)
*/-----------------------------
--如果包含两个,如@str = '1,2'.
declare @str as varchar(30)
set @str = '1,2'
select * from tb where charindex(',' + left(@str , charindex(',' , @str) - 1) + ',' , ',' + typeid + ',') > 0 or
charindex(',' + substring(@str , charindex(',' , @str) + 1 , len(@str)) + ',' , ',' + typeid + ',') > 0
select * from tb where ',' + typeid + ',' like '%,' + left(@str , charindex(',' , @str) - 1) + ',%' or
',' + typeid + ',' like '%,' + substring(@str , charindex(',' , @str) + 1 , len(@str)) + ',%'
/*
ID TypeID
----------- ------------------------------
1 1,2,3,4,5,6,7,8,9,10,11,12
2 2,3
4 2,6
(所影响的行数为 3 行)
*/-------------------------------------------
--如果包含三个或四个,用PARSENAME函数来处理.
declare @str as varchar(30)
set @str = '1,2,3,4'
select * from tb where
charindex(',' + parsename(replace(@str , ',' , '.') , 4) + ',' , ',' + typeid + ',') > 0 or
charindex(',' + parsename(replace(@str , ',' , '.') , 3) + ',' , ',' + typeid + ',') > 0 or
charindex(',' + parsename(replace(@str , ',' , '.') , 2) + ',' , ',' + typeid + ',') > 0 or
charindex(',' + parsename(replace(@str , ',' , '.') , 1) + ',' , ',' + typeid + ',') > 0
select * from tb where
',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 4) + ',%' or
',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 3) + ',%' or
',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 2) + ',%' or
',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 1) + ',%'
/*
ID TypeID
----------- ------------------------------
1 1,2,3,4,5,6,7,8,9,10,11,12
2 2,3
3 3,7,8,9
4 2,6
5 4,5
(所影响的行数为 5 行)
*/---------------------------------------
--如果超过四个,则只能使用函数或动态SQL来分解并查询数据。
/*
名称:fn_split函数.
功能:实现字符串分隔功能的函数
*/
create function dbo.fn_split(@inputstr varchar(8000), @seprator varchar(10))
returns @temp table (a varchar(200))
as
begin
declare @i int
set @inputstr = rtrim(ltrim(@inputstr))
set @i = charindex(@seprator , @inputstr)
while @i >= 1
begin
insert @temp values(left(@inputstr , @i - 1))
set @inputstr = substring(@inputstr , @i + 1 , len(@inputstr) - @i)
set @i = charindex(@seprator , @inputstr)
end
if @inputstr <> '\'
insert @temp values(@inputstr)
return
end
go--调用
declare @str as varchar(30)
set @str = '1,2,3,4,5'select distinct m.* from tb m,
(select * from dbo.fn_split(@str,',')) n
where charindex(',' + n.a + ',' , ',' + m.typeid + ',') > 0drop table tb
drop function dbo.fn_split /*
ID TypeID
----------- ------------------------------
1 1,2,3,4,5,6,7,8,9,10,11,12
2 2,3
3 3,7,8,9
4 2,6
5 4,5
(所影响的行数为 5 行)
*/------------------------------------------
--使用动态SQL的语句。
declare @str varchar(200)
declare @sql as varchar(1000)
set @str = '1,2,3,4,5'
set @sql = 'select ''' + replace(@str , ',' , ''' as id union all select ''')
set @sql = @sql + ''''
set @sql = 'select distinct a.* from tb a , (' + @sql + ') b where charindex(' + ''','' + b.id + ' + ''',''' + ' , ' + ''','' + a.typeid + ' + ''',''' + ') > 0 '
exec (@sql)
/*
ID TypeID
----------- ------------------------------
1 1,2,3,4,5,6,7,8,9,10,11,12
2 2,3
3 3,7,8,9
4 2,6
5 4,5
(所影响的行数为 5 行)
*/
--把parm1构造成表结构,可写入临时表中
exec('insert into #temp select '+replace(replace(param1,',', 'union all select'),'.',',')
--select 1,资产负债表,11,2010,10 union all select 1,利润表,13,2010,10 union all select 2,资产负债表,11,2010,10 union all select 2,利润表,2010,10
先逗号,再使用parsename切割三个点之间
我是 set @s='select @para3=sum(Data) from(
select Data from tb where '+@para1 + 'union all
select -Data from tb where '+@para2+')t '
exec sp_executesql @s,N'@para3 int output',@para3 output
这种方式拼接,执行的,在sql查询分析器里能执行成功,得到返回值,但是在c#代码里就得不到output的值。