日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

實(shí)現(xiàn)刪除主表數(shù)據(jù)時(shí), 判斷與之關(guān)聯(lián)的外鍵表是否有數(shù)據(jù)_Mssql數(shù)據(jù)庫(kù)教程

編輯Tag賺U幣
教程Tag:暫無(wú)Tag,歡迎添加,賺取U幣!

推薦:經(jīng)驗(yàn)總結(jié):講解大型數(shù)據(jù)庫(kù)的設(shè)計(jì)準(zhǔn)則
這篇文章主要介紹了大型數(shù)據(jù)庫(kù)設(shè)計(jì)所應(yīng)掌握的基本準(zhǔn)則,具體內(nèi)容請(qǐng)參考下文。 一個(gè)好的數(shù)據(jù)庫(kù)產(chǎn)品不等于就有一個(gè)好的應(yīng)用系統(tǒng),如果不能設(shè)計(jì)一個(gè)合理的數(shù)據(jù)庫(kù)模型,不僅會(huì)增加客戶端和服務(wù)器

問(wèn)題描述:
某個(gè)基礎(chǔ)信息表,與系統(tǒng)中30多個(gè)表存在外鍵關(guān)系,當(dāng)刪除基礎(chǔ)數(shù)據(jù)時(shí),需要判斷是否已經(jīng)被用過(guò),如果用過(guò)則更改標(biāo)志位,如果沒(méi)有用過(guò)則直接刪除,如何能很好實(shí)現(xiàn)這個(gè)處理?最好能夠自動(dòng)適應(yīng)表的變化
問(wèn)題解決(SQL Server 2005
-- SQL Server 2005的錯(cuò)誤處理容易控制, 因此, SQL Server 2005中可以直接刪除, 通過(guò)錯(cuò)誤處理來(lái)確定是否需要更新.
-- 示例如下.
USE tempdb
GO
CREATE TABLE m(
id int PRIMARY KEY,
bz bit)
INSERT m SELECT 1, 0
UNION ALL SELECT 2, 0
CREATE TABLE c(
id int primary key,
a_id int references m(id)
ON DELETE NO ACTION)
INSERT c SELECT 1, 1
GO
-- 刪除處理存儲(chǔ)過(guò)程
CREATE PROC dbo.p_delete
@id int
AS
SET NOCOUNT ON
BEGIN TRY
BEGIN TRAN
DELETE FROM m WHERE id = @id
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
IF ERROR_NUMBER() = 547 -- 如果是外鍵約束錯(cuò)誤
BEGIN
BEGIN TRY
BEGIN TRAN -- 更新標(biāo)志
UPDATE m SET bz = 1
WHERE id = @id
COMMIT TRAN
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER(), ERROR_MESSAGE()
END CATCH
END
ELSE
SELECT ERROR_NUMBER(), ERROR_MESSAGE()
END CATCH
GO
-- 調(diào)用
EXEC dbo.p_delete 1
EXEC dbo.p_delete 2
SELECT * FROM m
SELECT * FROM c
GO
DROP TABLE c, m
DROP PROC dbo.p_delete
問(wèn)題解決(SQL Server 2000
-- SQL Server 2000 對(duì)錯(cuò)誤處理不好控制, 一般還是建議做判斷
-- 通過(guò)系統(tǒng)表查詢系統(tǒng)表,可以獲取某個(gè)表關(guān)聯(lián)的所有外鍵表
-- 示例存儲(chǔ)過(guò)程
CREATE PROC dbo.p_Delete
@tbname sysname, -- 基礎(chǔ)數(shù)據(jù)表名
@PkFieldName sysname, -- 基礎(chǔ)數(shù)據(jù)表關(guān)鍵字段名
@PkValue int -- 要?jiǎng)h除的基礎(chǔ)數(shù)據(jù)表關(guān)鍵字值
AS
SET NOCOUNT ON
DECLARE @bz bit, @s nvarchar(4000)
DECLARE tb CURSOR LOCAL
FOR
SELECT N'
SET @bz = CASE WHEN EXISTS(
SELECT * FROM ' QUOTENAME(@tbname)
N' A, ' QUOTENAME(OBJECT_NAME(B.fkeyid))
N' B
WHERE A.' QUOTENAME((SELECT name FROM syscolumns WHERE colid = B.rkey AND id = B.rkeyid))
N' = B.' QUOTENAME((SELECT name FROM syscolumns WHERE colid = B.fkey AND id = B.fkeyid))
N' AND A.' QUOTENAME((SELECT name FROM syscolumns WHERE colid = B.rkey AND id = B.rkeyid))
N' = @id) THEN 1 ELSE 0 END'
FROM sysobjects A
JOIN sysforeignkeys B
ON A.id= B.constid
JOIN sysobjects C
ON A.parent_obj = C.id
WHERE A.xtype = 'f'
AND C.xtype = 'U'
AND OBJECT_NAME(B.rkeyid) = @tbname
OPEN tb
FETCH tb INTO @s
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_executesql @s, N'@tbname sysname, @id int, @bz bit OUT', @tbname, @PkValue, @bz OUT
IF @bz = 1
BEGIN
SET @s = N'UPDATE ' QUOTENAME(@tbname)
N' SET bz = 1 WHERE ' QUOTENAME(@PkFieldName)
N' = @id'
EXEC sp_executesql @s, N'@id int', @PkValue
RETURN
END
FETCH tb INTO @s
END
CLOSE tb
DEALLOCATE tb
SET @s = N'DELETE FROM ' QUOTENAME(@tbname)
N' WHERE ' QUOTENAME(@PkFieldName)
N' = @id'
EXEC sp_executesql @s, N'@id int', @PkValue
GO
注意事項(xiàng)
設(shè)置表的主/外鍵關(guān)系的時(shí)候,不要設(shè)置級(jí)聯(lián)刪除(ON DELETE CASCADE)

分享:SQL Server各種日期計(jì)算方法之二
  上個(gè)月的最后一天      這是一個(gè)計(jì)算上個(gè)月最后一天的例子。它通過(guò)從一個(gè)月的最后一天這個(gè)例子上減去3毫秒來(lái)獲得。有一點(diǎn)要記住,在Sql Server中時(shí)間是精確到3毫秒。這就是為

來(lái)源:模板無(wú)憂//所屬分類:Mssql數(shù)據(jù)庫(kù)教程/更新時(shí)間:2008-08-22
相關(guān)Mssql數(shù)據(jù)庫(kù)教程