日期:2014-05-17  浏览次数:20402 次

如何使用sql查询语句处理关于表的某项数据更新的问题(问题内详)
假设目前我有一个表A:
其中表A如下
  id name
  001 李
  002 王
  003 罗

(更新前的表A)
现在,我要更新表A中id=001的name的数据
并且定义一个int类型的变量@b,并将@b初始化为1
当@b<一个指定的函数,假设为3时,持续更新表A中id=001的name的数据
如果我要将表A更新后的数据为如下,那用sql查询语句应该怎么写?
更新后的表A:
  id name
  001 李1
  001 李2
  001 李3 
  002 王
  003 罗

(更新后的表A)

如果只能使用一次table函数,这个问题应该如何解决?

------解决方案--------------------
你的需求,当参数大于已有的记录数时,只通过更新是实现不了,除了更新已有的数据,还需要插入新数据
------解决方案--------------------
自己构造函数
------解决方案--------------------
你这个所谓的更新更多是插入吧?如果要做,那先要判断表中现有数量,然后和你的参数比较,只有小于等于的情况下才进行操作,另外如果你要这样做的话,每次循环都要判断哦,因为当你插入新数据的时候,数量又多了一条。又要重新判断。你得需求是想实现什么?或者说这是什么类型的应用,看看有没有别的方法来实现。
------解决方案--------------------
1、其实不应该有完全一样的数据,这违反了关系数据库理论。你的相同数据应该是某些字段而已。
2、找出不相同的数据方法有很多,比如用exists、用except等等,你找到了,再筛选top1就可以拉
------解决方案--------------------
是不奇怪,但是不应该。你想想如果允许这样的数据存在的话:
1、查询的时候怎么办?不能每次都distinct吧?
2、更新的时候才是头疼的。
3、这是不合理的冗余,占了空间,也没意义。

所以强烈建议每个表都要有一个主键,无论是复合的还是但主键。
------解决方案--------------------
delete from @ta where name=@b3+CONVERT(char(1),@i)
下加一条
delete from @ta where name=@b4+CONVERT(char(1),@i)


------解决方案--------------------
根据你的思路我也写了一段代码
SQL code

CREATE TABLE t(id VARCHAR(20),[name] VARCHAR(20))
INSERT INTO t
SELECT '001','张三'
UNION
SELECT '002','李四'
GO
IF EXISTS (SELECT 1 FROM sys.objects  WHERE NAME = 'f_csdn')
    DROP FUNCTION f_csdn
GO
create FUNCTION [dbo].[f_csdn]   
(  
 @id VARCHAR(20),
 @num int
)  
RETURNS   
@tmp TABLE   
(  
 id    VARCHAR(20),
 [name] VARCHAR(20) 
)  
AS  
BEGIN  
      
 DECLARE @name AS VARCHAR(20);
 IF  EXISTS (SELECT 1 FROM t WHERE id = @id)
    SELECT TOP 1 @name=  [Name] FROM t WHERE id = @id
 ELSE
     RETURN;
     
 WHILE @num >= 1  
 BEGIN      
  INSERT INTO @tmp VALUES(@id,@name+RTRIM(LTRIM(str(@num))))  
  set @num  = @num -1
 END  
 RETURN  
END  
GO
SELECT * FROM T
UNION
SELECT * FROM f_csdn('001',3)
GO
DROP TABLE t
DROP FUNCTION f_csdn
GO