我觉得没有必要做修改。因为在Ms SqlServer 中修改记录相当于把原记录删除再新增新的记录。所以如果记录已存在的话我觉得应删除了再新增新的记录。
解决方案 »
- 存储过程调用存储过程结果问题
- 下面的SQL语句怎么实现
- 如何匹配表1和表2的数据
- 加急,一定送分!可能是大小写敏感的问题,应该怎么解决?我将一个数据库里面的存储过程,导入到另一个存储过程时,提示某一存储过程中的参数未
- 有没有把SQLSERVER表里的数据导入到ORACLE表里的工具?
- 如何在查询时候新增一BIT列
- sql server新建数据库时自动出现之前的表
- 初次学sqlserver2000,请帮忙,我的数据库我注册的是windows身份验证,当我改成sqlserver身份验证时,一连接就失败,怎么回事呀???、
- 数据库的不同备份
- 数据库压缩备份
- 我装了orical8i 后再装sql server,服务器连不上
- 怎么改为SQL Server 和 Windows身份验证方式?谢谢!
if Exists(Select * from 表名 where 主键='')
Delete 表名 where 主键=''
Insert Into 表名 values(.....)
那在客户端程序中是不是可以这样写
Dim StrSQL as String
For i=1 to 1000
strSql="if Exists(Select * from 表名 where 主键=" & i & ") " & _
" Delete 表名 where 主键=" & i & _
" Insert Into 表名 values(.....)"
rs.open(strSql, ....)
rs.close
Next
我感觉这样的效率是不是很低啊?
一个insert
一个update就可以了
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO/****** Object: Stored Procedure dbo.RUpdatetable Script Date: 2003-03-06 14:17:10 ******/
/****************************************
Function:
R_ImportTable用于从源表更新目的表,更新目的表中
关键字与源表关键字相同的数据记录,当源表中含有目的表中
不存在的记录时把不存在的记录插入到目的表中
Prameter:
@TableNo传递的目的表表名称或表ID号,@Flags为更新参数,当为0
时把目的表替换为源表,当为1时仅更新不相同与不存在于目的表
中的记录。
Note:
不支持无主关键字段表结构
************************************/
ALTER Proc R_ImportTable(@SourceTable varchar(30),
@DestTable varchar(30) ,
@Flags bit)
as
Begin
declare @error int
declare @ErrorId Int IF NOT EXISTS(SELECT name FROM sysobjects WHERE name =@DestTable AND type = 'U')
begin
raiserror('您所更新的数据表%s不存在,请核对。', 16, 1, @DestTable)
return
end
/*---出现错误时,进行临时表的更改
exec('drop table '+@DestTable)
exec(' select * into '+@DestTable+ ' from '+@sourceTable)
*/
IF NOT EXISTS(SELECT name FROM sysobjects WHERE name =@SourceTable AND type = 'U')
begin
raiserror('您所更新的对照数据表%s不存在,请核对。', 16, 1, @SourceTable)
return
end
begin tran
declare @FieldStr nvarchar(50),@OneKeyF nvarchar(50),@SetStr nvarchar(1000)
declare @ListTstr nvarchar(1000),@ListFStr nvarchar(1000)
declare @IncField nvarchar(50)
set @SetStr =''--更新字段
set @FieldStr=''--表字段变量
set @ListFStr=''--目的表字段列表
set @ListTstr=''--临时表字段列表
set @OneKeyF =''--一个关键字段
set @IncField=''--自增类型字段 if @Flags=0
begin
select @IncField=name from syscolumns --找出自增类型
where id = OBJECT_ID(@DestTable) and colstat & 1 = 1
declare Enum_Field cursor for ---枚举表字段
(select name from syscolumns where id=OBJECT_ID(@DestTable))
open Enum_Field
fetch next from Enum_Field into @FieldStr
while @@fetch_status=0
begin
if (@FieldStr<>@IncField)
begin
set @ListFStr=@ListFStr+@FieldStr+','
end
fetch next from Enum_Field into @FieldStr
end
close Enum_Field
deallocate Enum_Field
set @ListFStr=substring(@ListFStr,1,len( @ListFStr)-1)
if (@DestTable not in ('hs_000a','hs_000b'))
begin
exec('truncate table '+@DestTable)
set @error = @@error
set @ErrorId=103601
if @error <> 0 goto error
end
exec('insert into '+@DestTable + '(' + @ListFStr + ')' +' select ' + @ListFStr + ' from '+@SourceTable)
set @error = @@error
set @ErrorId=103602
if @error <> 0 goto error
end
else if @Flags=1
begin
select @IncField=name from syscolumns --找出自增类型
where id = OBJECT_ID(@DestTable) and colstat & 1 = 1
declare Enum_Field cursor for ---枚举表字段
(select name from syscolumns where id=OBJECT_ID(@DestTable))
open Enum_Field
fetch next from Enum_Field into @FieldStr
while @@fetch_status=0
begin
if (@FieldStr<>@IncField)
begin
Set @SetStr=@SetStr+@FieldStr+'=T.'+@FieldStr+','
set @ListFStr=@ListFStr+@FieldStr+','
set @ListTstr=@ListTstr+'T.'+@FieldStr+','
set @OneKeyF=@FieldStr
end
fetch next from Enum_Field into @FieldStr
end
close Enum_Field
deallocate Enum_Field
Set @SetStr =substring(@SetStr, 1,len(@SetStr)-1 )
set @ListFStr=substring(@ListFStr,1,len( @ListFStr)-1)
set @ListTStr=substring(@ListTStr,1,len( @ListTStr)-1)
if NOT EXISTS(select name from dbo.R_GetTableIndex(@DestTable) )
begin
if (@DestTable not in ('hs_000a','hs_000b'))
begin
exec('truncate table '+@DestTable)
set @error = @@error
set @ErrorId=103603
if @error <> 0 goto error
end
exec('insert into '+@DestTable+' select * from '+@SourceTable)
set @error = @@error
set @ErrorId=103604
if @error <> 0 goto error
commit tran
return
end
declare @ConditionStr nvarchar(1000)---修改条件
set @ConditionStr=''
declare Enum_PrimaryKey cursor for ---枚举关键字
select name from dbo.R_GetTableIndex(@DestTable)
Open Enum_PrimaryKey
Fetch Next from Enum_PrimaryKey into @FieldStr
if @@fetch_status<>0
begin
close Enum_PrimaryKey
deallocate Enum_PrimaryKey
raiserror('您所更新的对照数据表%s不存关键字段,本过程无法处理!', 16, 1, @DestTable)
return
end
while @@fetch_status=0
begin
set @ConditionStr=@ConditionStr+'A.'+@FieldStr+'=T.'+@FieldStr+' And '
set @OneKeyF=@FieldStr
Fetch Next from Enum_PrimaryKey into @FieldStr
end
close Enum_PrimaryKey
deallocate Enum_PrimaryKey
Set @ConditionStr=substring(@ConditionStr, 1,len(@ConditionStr)-3)
declare @UpdateStr nvarchar(4000)---产生的更新语句
declare @InsertStr nvarchar(4000)---产生的插入语句
Set @updateStr=' update '+@DestTable
+' Set '+ @SetStr
+' from '+@DestTable+' A ,'+@SourceTable+' T'
+' where '+@ConditionStr
Set @InsertStr=' insert into '+@DestTable +
+' (' +@ListFStr +' )'
+' select '+@ListTstr+' from '
+@SourceTable+' T left outer join '+@DestTable+' A ON '
+@ConditionStr
+' where A.'+@OneKeyF
+' is null and not (T.'+@OneKeyF+' is Null)'
/*找出存在与a表中,但不在b表中的a数据记录
select a.* from multdid_temp a LEFT OUTER join multdid b on
a.did1=b.did1 and a.did2=b.did2
where b.did1 is NULL and not (a.did1 is NULL)
*/
print @updateStr Exec(@updateStr)
select @error=@@error
set @ErrorId=103605
if @error<>0 goto error print @InsertStr
Exec(@InsertStr)
Select @error=@@error
set @ErrorId=103606
if @error<>0 goto error
end --End of Flags=1
/*
update Atable string1
set col1=T.col1,--//过滤did字段
col2=T.col2,
col3=T.col3,
...........
from Atable A,tempAtable T
where //string2
A.Key1=T.Key2
and
A.key2=T.key2
and*/
commit tran
return error:
rollback transaction
exec insert_tracelog_pro '存储过程出错', @error, ' ', 'R_ImportTable'
raiserror (@error, 16, 1)
return isnull(@ErrorId,-1)
end
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO