當前位置:首頁 » 服務存儲 » 存儲過程中有重復的數據怎麼辦
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

存儲過程中有重復的數據怎麼辦

發布時間: 2022-09-08 10:40:40

存儲過程執行定時任務後出現重復值怎麼解決

什麼資料庫的?
出現重復有可能是幾種情況
1、你insert語句中本身數據就不對,有重復值。
2、如果執行多次,應該是前幾次數據沒清理掉。

這個要具體看代碼,憑你一個題目無法判斷是什麼情況

❷ oracle存儲過程有數據,但是出現未找到數據情況數據中沒有重復數據,如果有重復的數據怎麼寫,大神指教

這個在定義游標的時候就應該限定好
要確保同keywords的情況下沒有2條不同的記錄

sqlserver利用存儲過程去除重復行的sql語句

還是先上代碼吧
,可以先看
SQL語句去掉重復記錄,獲取重復記錄
復制代碼
代碼如下:
ALTER
procere
[dbo].[PROC_ITEMMASTER_GETUNIQUE]
@PAGEINDEX
INT,@uid
int,@itemnumber
varchar(50)
AS
begin
tran
--開始事務
drop
table
[ItemMaster].[dbo].[testim]
--刪除表
--把不重復記錄轉存到testim中
select
*
into
[ItemMaster].[dbo].[testim]
from
[ItemMaster].[dbo].[dat_item_master]
where
item_uid
in(select
min(item_uid)
as
item_uid
from
[ItemMaster].[dbo].[dat_item_master]
group
by
item_number)
and
status=0
select
top
10
*
from
[ItemMaster].[dbo].[testim]
where
item_uid
not
in
(select
top
(10*(@PAGEINDEX-1))
item_uid
from
[ItemMaster].[dbo].[testim])
and
owneruid=@uid
and
item_number
like
@itemnumber+'%'
--判斷是否出錯
if
@@error<>0
begin
rollback
tran
--出錯則回滾
end
else
begin
--否則提前事務
commit
tran
end
我的數據是這樣的:因為item_uid是標識列,item_number有重復的,
我想過濾成這樣:
順帶說幾個在編程的時候遇到的小問題
1.程序
出現
Could
not
find
stored
procere
找不到這個存儲過程
因為我的程序資料庫有四個,而默認連接是A,但實際要執行B庫里的存儲過程,導致出錯,
解決辦法1:可在A裡面建個一樣的存儲過程2:在執行連接的時候,替換下資料庫就行了
2.
asp.net/C#
將存儲過程中返回的數據集,填充到dataset/datatable
復制代碼
代碼如下:
SqlConnection
conn
=
new
SqlConnection(ConfigurationManager.ConnectionStrings["SolutionSQLServer"].ToString());
SqlCommand
cmd
=
new
SqlCommand("Test",conn);
cmd.CommandType
=
CommandType.StoredProcere;
cmd.Parameters.Add("@MaxId",
SqlDbType.Int).Value
=
12000;
SqlDataAdapter
sda
=
new
SqlDataAdapter(cmd);
DataTable
dt
=
new
DataTable();
sda.Fill(dt);
在這感謝
http://www.cnblogs.com/liujuncm5/archive/2009/08/31/1557569.html
3.在存儲過程裡面,寫SQL語句不能動態不加order
by
功能
比如
復制代碼
代碼如下:
--·@new_orderby
是傳入參數,不能這樣寫
select
top
(10*(2-1))
item_uid
from
testim
order
by
@new_orderby
--執行這個的時候,SQL會出現
The
SELECT
item
identified
by
the
ORDER
BY
number
1
contains
a
variable
as
part
of
the
expression
identifying
a
column
position.
Variables
are
only
allowed
when
ordering
by
an
expression
referencing
a
column
name.
不過我找到解決辦法,不過很麻煩,
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=9328
(第二個回答用
'
sql
'進行連接)
http://databases.aspfaq.com/database/how-do-i-use-a-variable-in-an-order-by-clause.html (用case
end
也行)
4.
select
into

insert
into
select
兩種復制文句
(這里感謝http://www.cnblogs.com/freshman0216/archive/2008/08/15/1268316.html)
1.INSERT
INTO
SELECT語句
語句形式為:Insert
into
Table2(field1,field2,...)
select
value1,value2,...
from
Table1
要求目標表Table2必須存在,由於目標表Table2已經存在,所以我們除了插入源表Table1的欄位外,還可以插入常量。
2.SELECT
INTO
FROM語句
語句形式為:SELECT
vale1,
value2
into
Table2
from
Table1
要求目標表Table2不存在,因為在插入時會自動創建表Table2,並將Table1中指定欄位數據復制到Table2中。
5.順便復習下常用的SQL方法語句
復制代碼
代碼如下:
declare
@name
varchar(200)
--聲明變數
set
@name='abcd;def'
--賦值
print
'exec
len
:'+Convert(varchar(10),Len(@name))
--convert(type,value)轉換,Len(value)獲取大小
print
'exec
charindex:'+Convert(varchar(10),CharIndex('e',@name))--CharIndex(find,value)
在value中查找find的位置
print
'not
replace:'+@name
print
'exec
replace:'+Replace(@name,';','')
--用replace替換
print
'exec
substring:'+Substring(@name,0,3)--用substring截取
print
@@RowCount
--返回上一行代碼受影響的行數
作者:chenhuzi

❹ oracle 存儲過成,刪除重復的數據

我沒用過oracle,但SQL腳本應該差不多吧。
我用MSSQL的腳本這樣寫,先查詢,你可以自己驗證一下,免得誤刪除了。
select * from 表名 a
where exists(select * from 表名 where 用戶=a.用戶 and 報告時間>=dateadd(d,-1,a.報告時間) and 報告時間<a.報告時間)
這兒有一點dateadd(d,-1,a.報告時間)指的是一天前,所以有可能昨天12點提前,但今天8點提交也會被刪除的。這兒可以視你的報告時間來定,若所有報告時間均是8:00——18:00,那麼可以使用dateadd(h,-10,a.報告時間)來。
刪除的腳本如下:
delete * from 表名 a
where exists(select * from 表名 where 用戶=a.用戶 and 報告時間>=dateadd(d,-1,a.報告時間) and 報告時間<a.報告時間)

❺ Sql Server表裡面有2行數據完全一樣,如何刪除

Sql
Server裡面如果沒有設定主鍵而刪除重復數據很麻煩:
一:保留重復記錄中的一條記錄,其他全部刪除。
--1:建立臨時表,把不重復的數據轉存
select
distinct
*
into
#Tmp
from
表名;
--2:刪除原表數據
truncate
table
表名;
--3:將數據導回
insert
into
表名
select
*
from
#Tmp;
--4:刪除臨時表
drop
table
#Tmp;
二:刪除全部重復記錄:
delete
from
表名
where
欄位1=xxx,欄位2=xxx....(把你重復記錄的條件列在這里)
---
以上,希望對你有所幫助。

❻ ORACLE存儲過程同步表數據出現重復,存儲過程如下

你這個不僅僅是重復,而且是大量重復吧。
你的游標那裡設定的是一個集合,也就是select form_id as formid from cc_busi_form。
我們假設他有三個值,0,1,2
那麼在下面循環時(for i in formid loop),我們假設每次讀取一個值,第一次讀取0,那麼後面的語句就變為
insert into cc_busi_form select form.*,'hx' from cc_busi_form@LINK_HX form where form.form_id<>0
也就是說form.form_id=1或2是插入的。
第二次i.formid=1,那麼form.form_id=0或2是插入的,這時form.form_id=2這部分就重復了。
第三次i.formid=2,那麼form.form_id=0或1是插入的,這時form.form_id=0和1這兩部分就都重復了。也就是說你插入的數據是原來數據的二倍的量。
你的formid越多,重復的量也就越大,大概是(formid的個數-1)倍(如果每個formid都不同,那麼就是它,如果有重復,那麼會有一定出入)。
其實沒必要用游標,直接用子查詢就行 not in 或者not exsit,當然,我不知道你的業務邏輯,具體的還要你自己看。

❼ 存儲過程插入sql數據會重復問題

你可以根據關鍵欄位判斷是否重復
if not exists (select * from TBL_CUST_DATA_TABLE_0000000298 where 關鍵欄位=)
BEGIN
insert into TBL_CUST_DATA_TABLE_0000000298
(FIELD_50028161,FIELD_50055037,FIELD_50179728,mobile_tele_no,FIELD_50252045,FIELD_50368392,FIELD_50569934,FIELD_50585876)
select CONTACT_ID, INQUIRE_CODE,CALLEE, CALLER, CUST_BAND,CUST_LEVEL,START_TIME,CREATE_TIME
from test_v8_busy_revisit where start_time >=begintime and start_time <=endtime and OUTBOUND_STAT ='1' ;
update test_v8_busy_revisit set OUTBOUND_STAT='10' where start_time >=begintime and start_time <=endtime and OUTBOUND_STAT ='1' ;
commit;
end;

❽ 存儲過程存儲不重復數據,如有重復返回重復的數據

先查詢數據存不存在,存在則返回查詢的值,不存在則insert然後返回success

❾ 一個存儲過程負責插入數據,job調用存儲過程後出現大量重復,job執行幾遍數據就重復幾遍,怎麼解決

存儲過程中,每次刪除原表裡的數據
譬如
begin
delete from 表名 where 條件;
commit;

然後這個地方再執行你原來存儲過程里的東西
end;

❿ oracle 存儲過程中,不想讓數據出現重復值該怎麼辦

你的表沒有主鍵的嗎?
如果你是一條記錄多個列不想有重復的值,你可以把這幾列建立唯一約束。
如果你是一列記錄不想有重復值,你可以把該列建立唯一約束。
你用存儲過程插入數據還要判斷是否重復,面對頻繁的插入你考慮到效率了沒有,而且還非常容易出錯。正常的方法都是通過約束達到去重。
如果非要使用存儲過程,
使用
if (select * from tablename where 你的列='你插入的變數') 判斷是否有值
then
dbms_output.putline('該值已經存在') ;
else
insert into tablename 你的列 values ('你插入的變數');
end if