Guest User

Untitled

a guest
Apr 27th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.03 KB | None | 0 0
  1. USE AdventureWorks
  2.  
  3. GO
  4.  
  5. --============== Supporting function dbo.udfGetFullQualName
  6. IF OBJECT_ID('dbo.udfGetFullQualName') IS NOT NULL
  7. DROP FUNCTION dbo.udfGetFullQualName
  8. GO
  9. CREATE FUNCTION dbo.udfGetFullQualName ( @ObjectId INTEGER )
  10. RETURNS VARCHAR(300)
  11. AS BEGIN
  12. DECLARE @schema_id BIGINT
  13. SELECT @schema_id = schema_id
  14. FROM sys.tables
  15. WHERE object_id = @ObjectId
  16. RETURN '[' + SCHEMA_NAME(@schema_id) + '].[' + OBJECT_NAME(@ObjectId)
  17. + ']'
  18. END
  19. GO
  20. --============ Supporting Function dbo.udfGetOnJoinClause
  21. IF OBJECT_ID('dbo.udfGetOnJoinClause') IS NOT NULL
  22. DROP FUNCTION dbo.udfGetOnJoinClause
  23. GO
  24. CREATE FUNCTION dbo.udfGetOnJoinClause ( @fkNameId INTEGER )
  25. RETURNS VARCHAR(1000)
  26. AS BEGIN
  27. DECLARE @OnClauseTemplate VARCHAR(1000)
  28. SET @OnClauseTemplate = '[<@pTable>].[<@pCol>] = [<@cTable>].[<@cCol>] AND '
  29. DECLARE @str VARCHAR(1000)
  30. SET @str = ''
  31. SELECT @str = @str + REPLACE(REPLACE(REPLACE(REPLACE(@OnClauseTemplate,
  32. '<@pTable>',
  33. OBJECT_NAME(rkeyid)),
  34. '<@pCol>',
  35. COL_NAME(rkeyid, rkey)),
  36. '<@cTable>', OBJECT_NAME(fkeyid)),
  37. '<@cCol>', COL_NAME(fkeyid, fkey))
  38. FROM dbo.sysforeignkeys fk
  39. WHERE fk.constid = @fkNameId --OBJECT_ID('FK_ProductArrearsMe_ProductArrears')
  40. RETURN LEFT(@str, LEN(@str) - LEN(' AND '))
  41. END
  42. GO
  43. --=========== CASECADE DELETE STORED PROCEDURE dbo.uspCascadeDelete
  44. IF OBJECT_ID('dbo.uspCascadeDelete') IS NOT NULL
  45. DROP PROCEDURE dbo.uspCascadeDelete
  46. GO
  47. CREATE PROCEDURE dbo.uspCascadeDelete
  48. @ParentTableId VARCHAR(300), -- TABLE NAME OR OBJECT (TABLE) ID (Production.Location)
  49. @WhereClause VARCHAR(2000), -- WHERE CLAUSE (Location.LocationID = 7)
  50. @ExecuteDelete CHAR(1) = 'N', -- 'Y' IF WANT TO DELETE DIRECTLY FROM SP,
  51. --'N' IF YOU NEED DELETE SCRIPT
  52. @FromClause VARCHAR(8000) = '', -- IF LEVEL 0, THEN KEEP DEFAULT
  53. @Level INTEGER = 0
  54. AS -- writen by Daniel Crowther 16 Dec 2004 - handles composite primary keys
  55.  
  56. SET NOCOUNT ON
  57.  
  58. /* Set up debug */
  59.  
  60. DECLARE @DebugMsg VARCHAR(4000),
  61. @DebugIndent VARCHAR(50)
  62.  
  63. SET @DebugIndent = REPLICATE('---', @@NESTLEVEL) + '> '
  64.  
  65. IF ISNUMERIC(@ParentTableId) = 0
  66. BEGIN -- assume owner is dbo and calculate id
  67.  
  68. IF CHARINDEX('.', @ParentTableId) = 0
  69. SET @ParentTableId = OBJECT_ID('[dbo].[' + @ParentTableId
  70. + ']')
  71.  
  72. ELSE
  73. SET @ParentTableId = OBJECT_ID(@ParentTableId)
  74.  
  75. END
  76.  
  77. IF @Level = 0
  78. BEGIN
  79.  
  80. PRINT @DebugIndent
  81. + ' **************************************************************************'
  82.  
  83. PRINT @DebugIndent + ' *** Cascade delete ALL data from '
  84. + dbo.udfGetFullQualName(@ParentTableId)
  85.  
  86. IF @ExecuteDelete = 'Y'
  87. PRINT @DebugIndent
  88. + ' *** @ExecuteDelete = Y *** deleting data...'
  89.  
  90. ELSE
  91. PRINT @DebugIndent
  92. + ' *** Cut and paste output into another window and execute ***'
  93.  
  94. END
  95.  
  96. DECLARE @CRLF CHAR(2)
  97.  
  98. SET @CRLF = CHAR(13) + CHAR(10)
  99.  
  100. DECLARE @strSQL VARCHAR(4000)
  101.  
  102. IF @Level = 0
  103. SET @strSQL = 'SET NOCOUNT ON' + @CRLF
  104.  
  105. ELSE
  106. SET @strSQL = ''
  107.  
  108. SET @strSQL = @strSQL + 'PRINT ''' + @DebugIndent
  109. + dbo.udfGetFullQualName(@ParentTableId) + ' Level='
  110. + CAST(@@NESTLEVEL AS VARCHAR) + ''''
  111.  
  112. IF @ExecuteDelete = 'Y'
  113. EXEC ( @strSQL
  114. )
  115.  
  116. ELSE
  117. PRINT @strSQL
  118.  
  119. DECLARE curs_children CURSOR LOCAL FORWARD_ONLY
  120. FOR SELECT DISTINCT
  121. fkNameId = constid, -- constraint name
  122. cTableId = fkeyid -- child table
  123. FROM dbo.sysforeignkeys fk
  124. WHERE fk.rkeyid <> fk.fkeyid -- WE DO NOT HANDLE self referencing tables!!!
  125. AND fk.rkeyid = @ParentTableId
  126.  
  127. OPEN curs_children
  128.  
  129. DECLARE @fkNameId INTEGER,
  130. @cTableId INTEGER,
  131. @cColId INTEGER,
  132. @pTableId INTEGER,
  133. @pColId INTEGER
  134.  
  135. FETCH NEXT FROM curs_children INTO @fkNameId, @cTableId --, @cColId, @pTableId, @pColId
  136.  
  137. DECLARE @strFromClause VARCHAR(1000)
  138.  
  139. DECLARE @nLevel INTEGER
  140.  
  141. IF @Level = 0
  142. BEGIN
  143.  
  144. SET @FromClause = 'FROM ' + dbo.udfGetFullQualName(@ParentTableId)
  145.  
  146. END
  147.  
  148. WHILE @@FETCH_STATUS = 0
  149.  
  150. BEGIN
  151.  
  152. SELECT @strFromClause = @FromClause + @CRLF + ' INNER JOIN '
  153. + dbo.udfGetFullQualName(@cTableId) + @CRLF + ' ON '
  154. + dbo.udfGetOnJoinClause(@fkNameId)
  155.  
  156. SET @nLevel = @Level + 1
  157.  
  158. EXEC dbo.uspCascadeDelete @ParentTableId = @cTableId,
  159. @WhereClause = @WhereClause, @ExecuteDelete = @ExecuteDelete,
  160. @FromClause = @strFromClause, @Level = @nLevel
  161.  
  162. SET @strSQL = 'DELETE FROM ' + dbo.udfGetFullQualName(@cTableId)
  163. + @CRLF + @strFromClause + @CRLF + 'WHERE ' + @WhereClause
  164. + @CRLF
  165.  
  166. SET @strSQL = @strSQL + 'PRINT ''---' + @DebugIndent
  167. + 'DELETE FROM ' + dbo.udfGetFullQualName(@cTableId)
  168. + ' Rows Deleted: '' + CAST(@@ROWCOUNT AS VARCHAR)'
  169. + @CRLF + @CRLF
  170.  
  171. IF @ExecuteDelete = 'Y'
  172. EXEC ( @strSQL
  173. )
  174.  
  175. ELSE
  176. PRINT @strSQL
  177.  
  178. FETCH NEXT FROM curs_children INTO @fkNameId, @cTableId
  179.  
  180. --, @cColId, @pTableId, @pColId
  181.  
  182. END
  183.  
  184. IF @Level = 0
  185. BEGIN
  186.  
  187. SET @strSQL = @CRLF + 'PRINT ''' + @DebugIndent
  188. + dbo.udfGetFullQualName(@ParentTableId) + ' Level='
  189. + CAST(@@NESTLEVEL AS VARCHAR) + ' TOP LEVEL PARENT TABLE'''
  190. + @CRLF
  191.  
  192. SET @strSQL = @strSQL + 'DELETE FROM '
  193. + dbo.udfGetFullQualName(@ParentTableId) + ' WHERE '
  194. + @WhereClause + @CRLF
  195.  
  196. SET @strSQL = @strSQL + 'PRINT ''' + @DebugIndent + 'DELETE FROM '
  197. + dbo.udfGetFullQualName(@ParentTableId)
  198. + ' Rows Deleted: '' + CAST(@@ROWCOUNT AS VARCHAR)' + @CRLF
  199.  
  200. IF @ExecuteDelete = 'Y'
  201. EXEC ( @strSQL
  202. )
  203.  
  204. ELSE
  205. PRINT @strSQL
  206.  
  207. END
  208.  
  209. CLOSE curs_children
  210.  
  211. DEALLOCATE curs_children
  212.  
  213. GO
  214.  
  215. /*
  216.  
  217. -- Example 1
  218.  
  219. EXEC uspCascadeDelete
  220.  
  221. @ParentTableId = 'Production.Location',
  222.  
  223. @WhereClause = 'Location.LocationID = 2'
  224.  
  225. -- ,@ExecuteDelete = 'Y'
  226.  
  227. -- Example 2
  228.  
  229. EXEC uspCascadeDelete
  230.  
  231. @ParentTableId = 'dbo.brand',
  232.  
  233. @WhereClause = 'brand.brand_name <> ''Apple'''
  234.  
  235. -- ,@ExecuteDelete = 'Y'
  236.  
  237. exec uspCascadeDelete
  238.  
  239. @ParentTableId = 'dbo.product_type',
  240.  
  241. @WhereClause = 'product_type.product_type_id NOT IN
  242.  
  243. (SELECT bpt.product_type_id FROM dbo.brand_product_type bpt)'
  244.  
  245. -- ,@ExecuteDelete = 'Y'
  246.  
  247. */
Add Comment
Please, Sign In to add comment