首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求救,根据多ID更新多字段解决思路

2012-02-03 
求救,根据多ID更新多字段求救,根据多ID更新多字段需要传3个参数,2个ID(双主键),1个时间。都是数组形式的ID1

求救,根据多ID更新多字段
求救,根据多ID更新多字段
需要传3个参数,2个ID(双主键),1个时间。都是数组形式的
ID1   =   '1,2,3,4 '
ID2   =   '101,102,103,104 '
TDay   =   '2007-1-3,2007-1-4,2007-1-15,2007-2-6 '

每组都是相同数量的个数,比如都是4组数

例如:update   [Table]   set   TDay   =   '2007-1-3 '   where   ID1   =1   AND   ID2   =   101  

更新4组,何如在存储过程中实现啊,谢谢大家了!

[解决办法]

create table T(ID1 int, ID2 int, TDay datetime)
insert T select 1, 101, null
insert T select 2, 102, null
insert T select 3, 103, null
insert T select 4, 104, null
insert T select 5, 105, null

create proc pc(@ID1 varchar(200), @ID2 varchar(200), @TDay varchar(1000))
as
declare @tb table(ID1 int, ID2 int, TDay datetime)

while(charindex( ', ', @ID1)> 0)
begin
insert @tb select
substring(@ID1, 1, charindex( ', ', @ID1)-1),
substring(@ID2, 1, charindex( ', ', @ID2)-1),
substring(@TDay, 1, charindex( ', ', @TDay)-1)


select @ID1=stuff(@ID1, 1, charindex( ', ', @ID1), ' '),
@ID2=stuff(@ID2, 1, charindex( ', ', @ID2), ' '),
@TDay=stuff(@TDay, 1, charindex( ', ', @TDay), ' ')
end

insert @tb select @ID1, @ID2, @TDay

update T set TDay=B.TDay
from @tb as B
where T.ID1=B.ID1 and T.ID2=B.ID2
go

declare @ID1 varchar(200), @ID2 varchar(200), @TDay varchar(1000)
select
@ID1 = '1,2,3,4 ',
@ID2 = '101,102,103,104 ',
@TDay = '2007-1-3,2007-1-4,2007-1-15,2007-2-6 '

exec pc @ID1, @ID2, @TDay
go

select * from T

--result
ID1 ID2 TDay
----------- ----------- ------------------------------------------------------
1 101 2007-01-03 00:00:00.000
2 102 2007-01-04 00:00:00.000
3 103 2007-01-15 00:00:00.000
4 104 2007-02-06 00:00:00.000
5 105 NULL

[解决办法]

CREATE FUNCTION dbo.f_splitstr(
@str varchar(8000)
)RETURNS @r TABLE(id int IDENTITY(1, 1), value varchar(5000))
AS
BEGIN
DECLARE @pos int
SET @pos = CHARINDEX( ', ', @str)
WHILE @pos > 0
BEGIN
INSERT @r(value) VALUES(LEFT(@str, @pos - 1))
SELECT
@str = STUFF(@str, 1, @pos, ' '),
@pos = CHARINDEX( ', ', @str)
END
IF @str > ' '
INSERT @r(value) VALUES(@str)
RETURN
END
GO

-- 调用函数实现处理
DECLARE @id1s varchar(8000), @id2s varchar(8000), @dates varchar(8000)
SELECT
@id1s = '1,2,3,4 ',
@id2s = '101,102,103,104 ',
@dates= '2007-1-3,2007-1-4,2007-1-15,2007-2-6 '

--UPDATE A SET TDay = B.dt
--FROM [Table] A,(
SELECT
id1 = CONVERT(int, ID1.value),
id2 = CONVERT(int, ID2.value),
dt = CONVERT(datetime, DT.value)
FROM dbo.f_splitstr(@id1s) ID1, dbo.f_splitstr(@id2s) ID2, dbo.f_splitstr(@dates) DT
WHERE ID1.id = ID2.id
AND ID1.id = DT.id
--)B
--WHERE A.ID1 = B.ID1 AND A.ID2 = B.ID2
GO

DROP FUNCTION f_splitstr

[解决办法]
--创建一个分割字符串的函数

CREATE FUNCTION dbo.f_splitSTR(


@s varchar(8000), --要分拆的字符串
@split varchar(10), --数据分隔符
@pos int -- 取第几个
)RETURNS varchar(100)
AS
BEGIN
DECLARE @splitlen int, @re varchar(100)
SET @splitlen=LEN(@split+ 'a ') - 2
WHILE CHARINDEX(@split,@s) > 0 AND @pos > 0
SELECT
@re = LEFT(@s,CHARINDEX(@split,@s)-1),
@s=STUFF(@s,1,CHARINDEX(@split, @s)+@splitlen, ' '),
@pos = @pos - 1
RETURN(CASE
WHEN @pos = 0 THEN @re
WHEN @pos = 1 THEN @s
ELSE NULL END)
END
GO

--这个函数可以得到数组的个数

CREATE function getStrCount (@str varchar(8000),@splitstr varchar(100))
returns int
as
begin
declare @int_return int
declare @start int
declare @next int

declare @location int

select @next = 0
select @location = 1


if len(@str) > 0
select @int_return = 0
if charindex(@splitstr,@str) = 0
select @int_return =0

while (@location <> 0)
begin
select @start = @location + 1
select @location = charindex(@splitstr,@str,@start)
select @next = @next + 1
select @int_return = @next

end

return @int_return
end

declare @num int
select @num=dbo.getStrCount( '1,2,3,4,5,6 ', ', ')
print @num


create proc update_date(@ID1 varchar(1000),@ID2 varchar(1000),@TDay varchar(1000))
as

declare @Num int
declare @Cnt int
select @Num=dbo.getStrCount(@ID1, ', ')

set @Cnt = 1
while @Cnt <= @Num
begin
update [Table]
set TDay = (select dbo.f_splitSTR(@TDay, ', ', @Cnt))
where ID1 =(select dbo.f_splitSTR(@ID1, ', ', @Cnt)) AND ID2 = (select dbo.f_splitSTR(@ID2, ', ', @Cnt))
end


适适这个

热点排行