根据B表替换A表字段内容

老大i 2019-01-25 05:11:05
主要用到两个表:
用户表
客户表

目的:
UPDATE更新客户表cust_Admin字段

条件:
根据用户表usr_Account为条件,替换为usr_Name

替换识别符:<xxxxxx>

比如:A公司的cust_Admin为 <陈s><小傻子>
...全文
202 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
老大i 2019-01-26
  • 打赏
  • 举报
回复
引用 8 楼 唐诗三百首 的回复:
SQL2000写法,

CREATE TABLE 用户表(
[user_ID] INT
,[usr_Account] VARCHAR(20)
,[usr_Name] NVARCHAR(20)
,[usr_Password] VARCHAR(20)
,[usr_Super] BIT)

CREATE TABLE 客户表(
[cust_ID] INT
,[cust_No] VARCHAR(10)
,[cust_Name] NVARCHAR(10)
,[cust_Admin] VARCHAR(30))

INSERT INTO 用户表 VALUES(1,'aabbcc','陈s','abc123',1);
INSERT INTO 用户表 VALUES(4,'qqaa1','一棵小草','qq112233',0);
INSERT INTO 用户表 VALUES(5,'qqaaz','小傻子','wweedsw12',0);
INSERT INTO 用户表 VALUES(2,'test','测试账号','qweasd1',0);
INSERT INTO 用户表 VALUES(3,'testacc','花前月下','qqww21',0);

INSERT INTO 客户表 VALUES(1,'C001','A公司','<aabbcc><qqaaz>');
INSERT INTO 客户表 VALUES(2,'C002','B公司','<test><qqaaz>');
INSERT INTO 客户表 VALUES(3,'C003','C公司','<testacc>');


-- 更新客户表cust_Admin字段
declare @tsql nvarchar(max),@Account nvarchar(20),@Name nvarchar(20)
declare ap scroll cursor for select usr_Account,usr_Name from 用户表

open ap
fetch first from ap into @Account,@Name
while(@@fetch_status<>-1)
begin
select @tsql=N'update 客户表 set cust_Admin=replace(cust_Admin,''<'+@Account+N'>'',''<'+@Name+N'>'') '
--print @tsql
exec(@tsql)
fetch next from ap into @Account,@Name
end

close ap
deallocate ap


-- 结果
select * from 客户表

/*
cust_ID cust_No cust_Name cust_Admin
----------- ---------- ---------- ------------------------------
1 C001 A公司 <陈s><小傻子>
2 C002 B公司 <测试账号><小傻子>
3 C003 C公司 <花前月下>

(3 row(s) affected)
*/


真的不好意思,刚刚没看到来不及给分,还是谢谢版主。
老大i 2019-01-26
  • 打赏
  • 举报
回复
感谢两位版主~~
唐诗三百首 2019-01-26
  • 打赏
  • 举报
回复
SQL2000写法,

CREATE TABLE 用户表(
[user_ID] INT
,[usr_Account] VARCHAR(20)
,[usr_Name] NVARCHAR(20)
,[usr_Password] VARCHAR(20)
,[usr_Super] BIT)

CREATE TABLE 客户表(
[cust_ID] INT
,[cust_No] VARCHAR(10)
,[cust_Name] NVARCHAR(10)
,[cust_Admin] VARCHAR(30))

INSERT INTO 用户表 VALUES(1,'aabbcc','陈s','abc123',1);
INSERT INTO 用户表 VALUES(4,'qqaa1','一棵小草','qq112233',0);
INSERT INTO 用户表 VALUES(5,'qqaaz','小傻子','wweedsw12',0);
INSERT INTO 用户表 VALUES(2,'test','测试账号','qweasd1',0);
INSERT INTO 用户表 VALUES(3,'testacc','花前月下','qqww21',0);

INSERT INTO 客户表 VALUES(1,'C001','A公司','<aabbcc><qqaaz>');
INSERT INTO 客户表 VALUES(2,'C002','B公司','<test><qqaaz>');
INSERT INTO 客户表 VALUES(3,'C003','C公司','<testacc>');


-- 更新客户表cust_Admin字段
declare @tsql nvarchar(max),@Account nvarchar(20),@Name nvarchar(20)
declare ap scroll cursor for select usr_Account,usr_Name from 用户表

open ap
fetch first from ap into @Account,@Name
while(@@fetch_status<>-1)
begin
select @tsql=N'update 客户表 set cust_Admin=replace(cust_Admin,''<'+@Account+N'>'',''<'+@Name+N'>'') '
--print @tsql
exec(@tsql)
fetch next from ap into @Account,@Name
end

close ap
deallocate ap


-- 结果
select * from 客户表

/*
cust_ID cust_No cust_Name cust_Admin
----------- ---------- ---------- ------------------------------
1 C001 A公司 <陈s><小傻子>
2 C002 B公司 <测试账号><小傻子>
3 C003 C公司 <花前月下>

(3 row(s) affected)
*/
老大i 2019-01-26
  • 打赏
  • 举报
回复
引用 5 楼 卖水果的net 的回复:

-- 借2楼版主数据



alter function fn(@str varchar(200))
returns varchar(200)
as
begin
declare @result varchar(200) = @str
declare @account varchar(30), @name varchar(30)
declare sss cursor for select usr_account, usr_name from user_data
open sss
fetch sss into @account, @name
while @@FETCH_STATUS >= 0
begin
set @result = replace(@result, '<' + @account + '>', '<' + @name + '>')
fetch sss into @account, @name
end
close sss
deallocate sss
return @result
end
go

select *, dbo.fn([cust_Admin]) from custom_data



感谢,结贴
老大i 2019-01-26
  • 打赏
  • 举报
回复
引用 1 楼 吉普赛的歌 的回复:
USE tempdb
GO
IF OBJECT_ID('dbo.[user_data]') IS NOT NULL
DROP TABLE dbo.user_data
GO
CREATE TABLE dbo.user_data(
[user_ID] INT
,[usr_Account] VARCHAR(20)
,[usr_Name] NVARCHAR(20)
,[usr_Password] VARCHAR(20)
,[usr_Super] BIT
)
GO
IF OBJECT_ID('dbo.[custom_data]') IS NOT NULL
DROP TABLE dbo.custom_data
GO
CREATE TABLE dbo.custom_data(
[cust_ID] INT
,[cust_No] VARCHAR(10)
,[cust_Name] NVARCHAR(10)
,[cust_Admin] VARCHAR(30)
)
GO
SET NOCOUNT ON
INSERT INTO dbo.[user_data] VALUES(1,'aabbcc','陈s','abc123',1);
INSERT INTO dbo.[user_data] VALUES(4,'qqaa1','一棵小草','qq112233',0);
INSERT INTO dbo.[user_data] VALUES(5,'qqaaz','小傻子','wweedsw12',0);
INSERT INTO dbo.[user_data] VALUES(2,'test','测试账号','qweasd1',0);
INSERT INTO dbo.[user_data] VALUES(3,'testacc','花前月下','qqww21',0);
--
INSERT INTO dbo.custom_data VALUES(1,'C001','A公司','<aabbcc><qqaaz>');
INSERT INTO dbo.custom_data VALUES(2,'C002','B公司','<test><qqaaz>');
INSERT INTO dbo.custom_data VALUES(3,'C003','C公司','<testacc>');
------ 以上为测试表及测试数据 ------

--更新
;WITH cte AS (
SELECT *
,REPLACE(REPLACE((SELECT '【'+B.usr_Name+'】' FROM dbo.user_data AS B WHERE A.cust_Admin LIKE '%<'+B.usr_Account+'>%' FOR XML PATH('')),'【','<'),'】','>') AS cust_Admin_replace
FROM custom_data AS A
)
/*
select * from cte
*/
UPDATE cte
SET cust_Admin = cust_Admin_replace

--查询更新结果
SELECT * FROM dbo.custom_data AS cd
/*
cust_ID cust_No cust_Name cust_Admin
----------- ---------- ---------- ------------------------------
1 C001 A公司 <陈s><小傻子>
2 C002 B公司 <小傻子><测试账号>
3 C003 C公司 <花前月下>
*/


感谢,结贴。
卖水果的net 2019-01-26
  • 打赏
  • 举报
回复

-- 借2楼版主数据



alter function fn(@str varchar(200))
returns varchar(200)
as
begin
declare @result varchar(200) = @str
declare @account varchar(30), @name varchar(30)
declare sss cursor for select usr_account, usr_name from user_data
open sss
fetch sss into @account, @name
while @@FETCH_STATUS >= 0 
begin
	set @result = replace(@result, '<' + @account + '>', '<' + @name + '>')
	fetch sss into @account, @name
end
close sss
deallocate sss
return @result
end
go

select *, dbo.fn([cust_Admin]) from custom_data

老大i 2019-01-26
  • 打赏
  • 举报
回复
引用 3 楼 卖水果的net 的回复:
楼主用的是 2000 的版本?

嗯,是的,请问知道怎么改吗?
卖水果的net 2019-01-26
  • 打赏
  • 举报
回复
楼主用的是 2000 的版本?
老大i 2019-01-26
  • 打赏
  • 举报
回复
引用 1 楼 吉普赛的歌 的回复:
USE tempdb
GO
IF OBJECT_ID('dbo.[user_data]') IS NOT NULL
DROP TABLE dbo.user_data
GO
CREATE TABLE dbo.user_data(
[user_ID] INT
,[usr_Account] VARCHAR(20)
,[usr_Name] NVARCHAR(20)
,[usr_Password] VARCHAR(20)
,[usr_Super] BIT
)
GO
IF OBJECT_ID('dbo.[custom_data]') IS NOT NULL
DROP TABLE dbo.custom_data
GO
CREATE TABLE dbo.custom_data(
[cust_ID] INT
,[cust_No] VARCHAR(10)
,[cust_Name] NVARCHAR(10)
,[cust_Admin] VARCHAR(30)
)
GO
SET NOCOUNT ON
INSERT INTO dbo.[user_data] VALUES(1,'aabbcc','陈s','abc123',1);
INSERT INTO dbo.[user_data] VALUES(4,'qqaa1','一棵小草','qq112233',0);
INSERT INTO dbo.[user_data] VALUES(5,'qqaaz','小傻子','wweedsw12',0);
INSERT INTO dbo.[user_data] VALUES(2,'test','测试账号','qweasd1',0);
INSERT INTO dbo.[user_data] VALUES(3,'testacc','花前月下','qqww21',0);
--
INSERT INTO dbo.custom_data VALUES(1,'C001','A公司','<aabbcc><qqaaz>');
INSERT INTO dbo.custom_data VALUES(2,'C002','B公司','<test><qqaaz>');
INSERT INTO dbo.custom_data VALUES(3,'C003','C公司','<testacc>');
------ 以上为测试表及测试数据 ------

--更新
;WITH cte AS (
SELECT *
,REPLACE(REPLACE((SELECT '【'+B.usr_Name+'】' FROM dbo.user_data AS B WHERE A.cust_Admin LIKE '%<'+B.usr_Account+'>%' FOR XML PATH('')),'【','<'),'】','>') AS cust_Admin_replace
FROM custom_data AS A
)
/*
select * from cte
*/
UPDATE cte
SET cust_Admin = cust_Admin_replace

--查询更新结果
SELECT * FROM dbo.custom_data AS cd
/*
cust_ID cust_No cust_Name cust_Admin
----------- ---------- ---------- ------------------------------
1 C001 A公司 <陈s><小傻子>
2 C002 B公司 <小傻子><测试账号>
3 C003 C公司 <花前月下>
*/


谢谢,这个方法用版本已经测试可用。但是低版本
 FOR XML PATH('')

用不了。

可不可以参照http://blog.sina.com.cn/s/blog_63c31d660101obov.html的第一点改一改??
吉普赛的歌 2019-01-25
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('dbo.[user_data]') IS NOT NULL 
	DROP TABLE dbo.user_data
GO
CREATE TABLE dbo.user_data(
[user_ID] INT
,[usr_Account] VARCHAR(20)
,[usr_Name] NVARCHAR(20)
,[usr_Password] VARCHAR(20)
,[usr_Super] BIT
)
GO
IF OBJECT_ID('dbo.[custom_data]') IS NOT NULL 
	DROP TABLE dbo.custom_data
GO
CREATE TABLE dbo.custom_data(
[cust_ID] INT
,[cust_No] VARCHAR(10)
,[cust_Name] NVARCHAR(10)
,[cust_Admin] VARCHAR(30)
)
GO
SET NOCOUNT ON
INSERT INTO dbo.[user_data] VALUES(1,'aabbcc','陈s','abc123',1);
INSERT INTO dbo.[user_data] VALUES(4,'qqaa1','一棵小草','qq112233',0);
INSERT INTO dbo.[user_data] VALUES(5,'qqaaz','小傻子','wweedsw12',0);
INSERT INTO dbo.[user_data] VALUES(2,'test','测试账号','qweasd1',0);
INSERT INTO dbo.[user_data] VALUES(3,'testacc','花前月下','qqww21',0);
--
INSERT INTO dbo.custom_data VALUES(1,'C001','A公司','<aabbcc><qqaaz>');
INSERT INTO dbo.custom_data VALUES(2,'C002','B公司','<test><qqaaz>');
INSERT INTO dbo.custom_data VALUES(3,'C003','C公司','<testacc>');
------ 以上为测试表及测试数据 ------

--更新
;WITH cte AS (
	SELECT * 
	,REPLACE(REPLACE((SELECT '【'+B.usr_Name+'】' FROM dbo.user_data AS B WHERE A.cust_Admin LIKE '%<'+B.usr_Account+'>%' FOR XML PATH('')),'【','<'),'】','>') AS cust_Admin_replace
	FROM custom_data AS A 
)
/*
select * from cte
*/
UPDATE cte
SET cust_Admin = cust_Admin_replace

--查询更新结果
SELECT * FROM dbo.custom_data AS cd
/*
cust_ID     cust_No    cust_Name  cust_Admin
----------- ---------- ---------- ------------------------------
1           C001       A公司        <陈s><小傻子>
2           C002       B公司        <小傻子><测试账号>
3           C003       C公司        <花前月下>
*/

22,301

社区成员

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

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