Advertisement
Guest User

Untitled

a guest
Sep 1st, 2015
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.27 KB | None | 0 0
  1. SET ANSI_NULLS ON
  2. GO
  3. SET QUOTED_IDENTIFIER ON
  4. GO
  5. CREATE PROCEDURE [dbo].[sp_getDatabaseWideDuplicateDeleteScript] (@DiscludeTables varchar(max), @DiscludeColumns varchar(max), @Output varchar(max) output )
  6. AS
  7.  
  8.  
  9. --START SETUP DISCLUDE TABLES AND DISCLUDE COLUMNS
  10. --***************************************************
  11. --this section basically just splits the strings @discludetables and @discludecolumns by ';' occurance
  12. -- and sticks the resulting strings in to tables @@discludecolumns and @@discludeTables
  13. --Debug Variables
  14. --DECLARE @DiscludeTables varchar(max)
  15. --SET @DiscludeTables = '__MigrationHistory'
  16. --DECLARE @DiscludeColumns varchar(max)
  17. --SET @DiscludeColumns = 'Name'
  18. --DECLARE @Output varchar(max)
  19.  
  20. DECLARE @pos INT
  21. DECLARE @string varchar(max)
  22. DECLARE @@DiscludeTables TABLE
  23. (
  24. tableName varchar(max)
  25. )
  26.  
  27. DECLARE @@DiscludeColumns TABLE
  28. (
  29. columnName varchar(max)
  30. )
  31.  
  32. DECLARE @stringToSplit varchar(max)
  33. SET @stringToSplit = @DiscludeTables
  34.  
  35. WHILE CHARINDEX(';', @stringToSplit) > 0
  36. BEGIN
  37. SELECT @pos = CHARINDEX(';', @stringToSplit)
  38. SELECT @string = SUBSTRING(@stringToSplit, 1, @pos-1)
  39.  
  40. INSERT INTO @@DiscludeTables
  41. SELECT @string
  42.  
  43. SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
  44. END
  45. IF @stringToSplit IS NOT NULL AND @stringToSplit != ''
  46. BEGIN
  47. INSERT INTO @@DiscludeTables
  48. SELECT @stringToSplit
  49. END
  50.  
  51.  
  52.  
  53. SET @stringToSplit = @DiscludeColumns
  54.  
  55. WHILE CHARINDEX(';', @stringToSplit) > 0
  56. BEGIN
  57. SELECT @pos = CHARINDEX(';', @stringToSplit)
  58. SELECT @string = SUBSTRING(@stringToSplit, 1, @pos-1)
  59.  
  60. INSERT INTO @@DiscludeColumns
  61. SELECT @string
  62.  
  63. SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
  64. END
  65. IF @stringToSplit IS NOT NULL AND @stringToSplit != ''
  66. BEGIN
  67. INSERT INTO @@DiscludeColumns
  68. SELECT @stringToSplit
  69. END
  70.  
  71.  
  72. SET @Output = ''
  73. DECLARE @DBName varchar(max)
  74. SET @DBName = DB_NAME()
  75.  
  76. SELECT * FROM @@DiscludeColumns
  77. SELECT * FROM @@DiscludeTables
  78.  
  79.  
  80.  
  81. --**********************************************
  82. --END SETUP DISCLUDE TABLES AND DISCLUDE COLUMNS
  83.  
  84.  
  85.  
  86. --LOOP THROUGH ALL TABLES IN DATABASE NOT IN DISCLUDE TABLES
  87. --***********************************
  88. DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128)
  89. SET @TableName = ''
  90. WHILE @TableName IS NOT NULL
  91. BEGIN
  92.  
  93. --GET THE CURRENT TABLE
  94. SET @TableName =
  95.  
  96. (
  97. SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
  98. FROM INFORMATION_SCHEMA.TABLES
  99. WHERE TABLE_TYPE = 'BASE TABLE'
  100. AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
  101. AND OBJECTPROPERTY(
  102. OBJECT_ID(
  103. QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
  104. ), 'IsMSShipped'
  105. ) = 0
  106. AND TABLE_NAME NOT in (select tablename from @@DiscludeTables)
  107. )
  108.  
  109.  
  110.  
  111. --GET THE PRIMARY KEY COLUMN FOR THIS TABLE IF ANY
  112. --************************************************
  113. DECLARE @PkColumnName NVARCHAR(128) =
  114. (
  115. SELECT top 1 ccu.COLUMN_NAME
  116. FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
  117. JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu ON tc.CONSTRAINT_NAME = ccu.Constraint_name
  118. WHERE tc.CONSTRAINT_TYPE = 'Primary Key' AND '[dbo].['+TC.TABLE_NAME+']' = @TableName
  119. )
  120.  
  121. --LOOP THROUGH ALL COLUMNS NOT IN DISCLUDE COLUMNS
  122. --************************************************
  123. SET @ColumnName = ''
  124. DECLARE @columns nvarchar(max) = ' '
  125. WHILE @ColumnName IS NOT NULL
  126. BEGIN
  127. SET @ColumnName =
  128. (
  129. SELECT MIN(QUOTENAME(COLUMN_NAME))
  130. FROM INFORMATION_SCHEMA.COLUMNS
  131. WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
  132. AND TABLE_NAME = PARSENAME(@TableName, 1)
  133. AND QUOTENAME(COLUMN_NAME) > @ColumnName
  134. AND COLUMN_NAME NOT in (SELECT columnname FROM @@DiscludeColumns)
  135. )
  136.  
  137.  
  138. if @columnname != '['+@pkColumnName+']'
  139. BEGIN
  140. if @columns != ' '
  141. begin
  142. set @columns = @columns + ', '
  143. END
  144. set @columns = @columns + 't.'+@ColumnName
  145. END
  146. END
  147.  
  148.  
  149. if @columns != ' '
  150. BEGIN
  151. DECLARE @SQLSTRING varchar(max) =
  152. '
  153.  
  154. ;WITH CTE_META AS (
  155. SELECT [TableName] = ' + ''''+@tablename+''', t.*
  156. , [Rank] = ROW_NUMBER() OVER(
  157. PARTITION BY ' + @columns + '
  158. ORDER BY ' + 't.['+@pkColumnName+']
  159. ) FROM ' + @tablename + ' t
  160. )
  161. DELETE FROM ' + @tablename + '
  162. WHERE ' + @pkColumnName + ' IN (SELECT cte.'+@pkColumnName+' FROM CTE_META cte WHERE cte.Rank > 1)
  163.  
  164. --SELECT cte.*
  165. --FROM CTE_META cte
  166. --WHERE cte.RANK > 1
  167. '
  168. SET @Output = @Output + @SQLSTRING
  169.  
  170. END
  171.  
  172. END
  173. --END OF LOOP THROUGH TABLES
  174.  
  175. --**************************
  176. if @OUTPUT IS NOT NULL AND @OUTPUT != ''
  177. BEGIN
  178. SET @OUTPUT =
  179. 'use [' + @DBName + ']
  180.  
  181. ' + @Output
  182. END
  183. PRINT @OUTPUT
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement