Advertisement
LaughingMan

Raw MAF/Tiger Dataset Cleanup

Dec 4th, 2016
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 17.37 KB | None | 0 0
  1. USE RawTigerData
  2. GO
  3.  
  4. ALTER DATABASE RawTigerData
  5. SET RECOVERY SIMPLE
  6. GO
  7.  
  8. PRINT CONVERT(VARCHAR, GETDATE()) + ': Script started!'
  9.  
  10. DECLARE @Catalog NVARCHAR(MAX) = '',
  11.         @Schema NVARCHAR(MAX) = '',
  12.         @Table NVARCHAR(MAX) = '',
  13.         @CurrentTable NVARCHAR(MAX) = '',
  14.         @OriginalColumn NVARCHAR(MAX) = '',
  15.         @Column NVARCHAR(MAX) = '',
  16.         @OriginalDataType NVARCHAR(MAX) = '',
  17.         @DataType NVARCHAR(MAX) = '',
  18.         @MaxLength SMALLINT = 0,
  19.         @Precision SMALLINT = 0,
  20.         @Scale SMALLINT = 0,
  21.         @Index NVARCHAR(MAX) = '',
  22.         @SQL NVARCHAR(MAX) = '',
  23.         @FullSql NVARCHAR(MAX) = '',
  24.         @ExecSql NVARCHAR(MAX) = '',
  25.         @NewLineChar AS CHAR(2) = CHAR(13)
  26.  
  27. SELECT  A.name AS [SchemaName],
  28.         B.name AS [TableName],
  29.         C.name AS [ColumnName],
  30.         D.name AS [DataType],
  31.         C.max_length AS [MaxLength],
  32.         C.[precision] AS [Precision],
  33.         C.scale AS [Scale]
  34. INTO #Columns
  35. --SELECT *
  36. FROM sys.schemas A
  37. INNER JOIN sys.tables B
  38.     ON  B.[schema_id] = A.[schema_id]
  39. INNER JOIN sys.all_columns C
  40.     ON  C.[object_id] = B.[object_id]
  41. INNER JOIN sys.[types] D
  42.     ON  D.system_type_id = C.system_type_id
  43.     AND D.user_type_id = C.user_type_id
  44. WHERE   B.name != '__MigrationHistory'
  45.     AND C.name != 'Id'
  46.     AND D.name NOT IN ('geometry', 'geography')
  47. ORDER BY A.name, B.name, D.name, C.name
  48.  
  49. SELECT  @Schema = A.[SchemaName],
  50.         @Table = A.[TableName],
  51.         @OriginalColumn = A.[ColumnName],
  52.         @Column = A.[ColumnName],
  53.         @OriginalDataType = A.[DataType],
  54.         @DataType = A.[DataType],
  55.         @MaxLength = A.[MaxLength],
  56.         @Precision = A.[Precision],
  57.         @Scale = A.[Scale]
  58. FROM #Columns A
  59.  
  60. WHILE(@@ROWCOUNT > 0)
  61. BEGIN
  62.     DECLARE @TotalCount BIGINT = 0,
  63.             @NullCount BIGINT = 0,
  64.             @NumericCount BIGINT = 0,
  65.             @DecimalCount BIGINT = 0,
  66.             @MinValue REAL = 0,
  67.             @MaxValue REAL = 0,
  68.             @Nullable BIT = 0,
  69.             @AllNull BIT = 0,
  70.             @IsNumeric BIT = 0,
  71.             @IsDecimal BIT = 0,
  72.             @TotalLength SMALLINT = 0,
  73.             @WorkingColumn NVARCHAR(MAX) = '',
  74.             @NewColumn NVARCHAR(MAX) = ''
  75.  
  76.     SET @SQL = 'SELECT @TotalCount = COUNT(0) FROM [' + @Schema + '].[' + @Table + ']'
  77.     --PRINT @SQL
  78.     EXEC sp_executesql @SQL, N'@TotalCount BIGINT OUTPUT', @TotalCount OUTPUT
  79.    
  80.     SET @SQL = 'SELECT @NullCount = COUNT(0) FROM [' + @Schema + '].[' + @Table + '] WHERE [' + @Column + '] IS NULL'
  81.     --PRINT @SQL
  82.     EXEC sp_executesql @SQL, N'@NullCount BIGINT OUTPUT', @NullCount OUTPUT
  83.    
  84.     SET @SQL = 'SELECT @NumericCount = COUNT(0) FROM [' + @Schema + '].[' + @Table + '] WHERE ISNUMERIC([' + @Column + ']) = 1'
  85.     --PRINT @SQL
  86.     EXEC sp_executesql @SQL, N'@NumericCount BIGINT OUTPUT', @NumericCount OUTPUT
  87.  
  88.     SET @Nullable = CASE WHEN @NullCount > 0 THEN 1 ELSE 0 END
  89.     SET @AllNull = CASE WHEN @Nullable = 1 AND @TotalCount = @NullCount THEN 1 ELSE 0 END
  90.     SET @IsNumeric = CASE WHEN @AllNull = 0 AND @TotalCount = @NumericCount + @NullCount THEN 1 ELSE 0 END
  91.    
  92.     IF(@DataType LIKE '%varchar%')
  93.         BEGIN
  94.             SET @SQL = 'SELECT @TotalLength = MAX(LEN([' + @Column + '])) FROM [' + @Schema + '].[' + @Table + ']'
  95.             --PRINT @SQL
  96.             EXEC sp_executesql @SQL, N'@TotalLength SMALLINT OUTPUT', @TotalLength OUTPUT
  97.         END
  98.     ELSE IF(@IsNumeric = 1)
  99.         BEGIN
  100.             SET @SQL = 'SELECT @DecimalCount = COUNT(0) FROM [' + @Schema + '].[' + @Table + '] WHERE FLOOR([' + @Column + ']) <> [' + @Column + ']'
  101.             --PRINT @SQL
  102.             EXEC sp_executesql @SQL, N'@DecimalCount BIGINT OUTPUT', @DecimalCount OUTPUT
  103.            
  104.             SET @SQL = 'SELECT @MinValue = MIN([' + @Column + ']), @MaxValue = MAX([' + @Column + ']) FROM [' + @Schema + '].[' + @Table + ']'
  105.             --PRINT @SQL
  106.             EXEC sp_executesql @SQL, N'@MinValue REAL OUTPUT, @MaxValue REAL OUTPUT', @MinValue OUTPUT, @MaxValue OUTPUT
  107.            
  108.             SET @IsDecimal = CASE WHEN @IsNumeric = 1 AND @DecimalCount > 0 THEN 1 ELSE 0 END
  109.  
  110.             IF(@IsDecimal = 1)
  111.                 SET @DataType = 'real'
  112.             ELSE
  113.                 BEGIN
  114.                     IF(@MinValue >= 0 AND @MaxValue <= 255)
  115.                         SET @DataType = 'tinyint'
  116.                     ELSE IF(@MinValue >= -32768 AND @MaxValue <= 32767)
  117.                         SET @DataType = 'smallint'
  118.                     ELSE IF(@MinValue >= -2147483648 AND @MaxValue <= 2147483647)
  119.                         SET @DataType = 'int'
  120.                     ELSE
  121.                         SET @DataType = 'bigint'
  122.                 END
  123.         END
  124.    
  125.     PRINT '[' + @Schema + '].[' + @Table + '].[' + @Column + '] | ' + @OriginalDataType + ' | ' + @DataType + ' | Length: ' + CONVERT(NVARCHAR, @TotalLength) + ' | Min: ' + CONVERT(NVARCHAR, @MinValue) + ' | Max: ' + CONVERT(NVARCHAR, @MaxValue)
  126.     PRINT CONVERT(NVARCHAR, @TotalCount) + ' Total Records | ' + CONVERT(NVARCHAR, @NullCount) + ' Null Records | ' + CONVERT(NVARCHAR, @NumericCount) + ' Numeric Records | ' + CONVERT(NVARCHAR, @DecimalCount) + ' Decimal Records'
  127.     PRINT 'Is Nullable: ' + CASE WHEN @Nullable = 1 THEN 'TRUE' ELSE 'FALSE' END + ' | All Null: ' + CASE WHEN @AllNull = 1 THEN 'TRUE' ELSE 'FALSE' END + ' | Is Numeric: ' + CASE WHEN @IsNumeric = 1 THEN 'TRUE' ELSE 'FALSE' END + ' | Is Decimal: ' + CASE WHEN @IsDecimal = 1 THEN 'TRUE' ELSE 'FALSE' END
  128.  
  129.     IF(@Column LIKE '%10')
  130.         BEGIN
  131.             SET @WorkingColumn = '[' + @Schema + '].[' + @Table + '].[' + @Column + ']'
  132.             SET @NewColumn = REPLACE(@Column, '10', '')
  133.             EXEC sp_rename @WorkingColumn, @NewColumn, 'COLUMN'
  134.             SET @Column = @NewColumn
  135.         END
  136.    
  137.     IF(@Column LIKE '%INTPTLAT%')
  138.         BEGIN
  139.             SET @WorkingColumn = '[' + @Schema + '].[' + @Table + '].[' + @Column + ']'
  140.             EXEC sp_rename @WorkingColumn, 'LATITUDE', 'COLUMN'
  141.             SET @Column = 'LATITUDE'
  142.         END
  143.  
  144.     IF(@Column LIKE '%INTPTLON%')
  145.         BEGIN
  146.             SET @WorkingColumn = '[' + @Schema + '].[' + @Table + '].[' + @Column + ']'
  147.             EXEC sp_rename @WorkingColumn, 'LONGITUDE', 'COLUMN'
  148.             SET @Column = 'LONGITUDE'
  149.         END
  150.  
  151.     IF(@Column LIKE '%ALAND%')
  152.         BEGIN
  153.             SET @WorkingColumn = '[' + @Schema + '].[' + @Table + '].[' + @Column + ']'
  154.             EXEC sp_rename @WorkingColumn, 'AREALAND', 'COLUMN'
  155.             SET @Column = 'AREALAND'
  156.         END
  157.  
  158.     IF(@Column LIKE '%AWATER%')
  159.         BEGIN
  160.             SET @WorkingColumn = '[' + @Schema + '].[' + @Table + '].[' + @Column + ']'
  161.             EXEC sp_rename @WorkingColumn, 'AREAWATER', 'COLUMN'
  162.             SET @Column = 'AREAWATER'
  163.         END
  164.  
  165.     IF(@Column LIKE '%PLUS4%')
  166.         BEGIN
  167.             SET @SQL = 'ALTER TABLE [' + @Schema + '].[' + @Table + '] ALTER COLUMN [' + @Column + '] SMALLINT NULL'
  168.             --PRINT @SQL
  169.             EXEC @SQL
  170.             SET @DataType = 'smallint'
  171.         END
  172.  
  173.     IF(@DataType LIKE '%varchar%')
  174.         BEGIN
  175.             SET @SQL = 'ALTER TABLE [' + @Schema + '].[' + @Table + '] ALTER COLUMN [' + @Column + '] ' + @DataType + '(' + CASE WHEN @AllNull = 1 OR @TotalLength = 0 THEN 'MAX' ELSE CONVERT(NVARCHAR, @TotalLength) END + ') ' + CASE WHEN @Nullable = 1 THEN 'NULL' ELSE 'NOT NULL' END
  176.             --PRINT @SQL
  177.             EXEC (@SQL)
  178.         END
  179.     ELSE
  180.         BEGIN
  181.             SET @SQL = 'ALTER TABLE [' + @Schema + '].[' + @Table + '] ALTER COLUMN [' + @Column + '] ' + @DataType + ' ' + CASE WHEN @Nullable = 1 THEN 'NULL' ELSE 'NOT NULL' END
  182.             --PRINT @SQL
  183.             EXEC (@SQL)        
  184.         END
  185.  
  186.     DELETE FROM #Columns
  187.     WHERE   SchemaName = @Schema
  188.         AND TableName = @Table
  189.         AND ColumnName = @OriginalColumn
  190.  
  191.     SELECT  @Schema = A.[SchemaName],
  192.             @Table = A.[TableName],
  193.             @OriginalColumn = A.[ColumnName],
  194.             @Column = A.[ColumnName],
  195.             @OriginalDataType = A.[DataType],
  196.             @DataType = A.[DataType],
  197.             @MaxLength = A.[MaxLength],
  198.             @Precision = A.[Precision],
  199.             @Scale = A.[Scale]
  200.     FROM #Columns A
  201. END
  202.  
  203. DROP TABLE #Columns
  204.  
  205. PRINT 'Retrieving Spatial Indexes for deletion'
  206.  
  207. SELECT  A.name AS [Schema],
  208.         B.name AS [Table],
  209.         C.name AS [Index]
  210. INTO #DeleteIndex
  211. FROM    sys.schemas A
  212. INNER JOIN  sys.tables B
  213.         ON  B.[schema_id] = A.[schema_id]
  214. INNER JOIN sys.spatial_indexes C
  215.         ON C.[object_id] = B.[object_id]
  216. WHERE   C.is_primary_key = 0
  217. ORDER BY A.name, B.name, C.index_id
  218.  
  219. PRINT 'Retrieving Indexes for deletion'
  220.  
  221. INSERT INTO #DeleteIndex
  222. SELECT  A.name AS [Schema],
  223.         B.name AS [Table],
  224.         C.name AS [Index]
  225. FROM    sys.schemas A
  226. INNER JOIN  sys.tables B
  227.         ON  B.[schema_id] = A.[schema_id]
  228. INNER JOIN sys.indexes C
  229.         ON C.[object_id] = B.[object_id]
  230. WHERE   C.is_primary_key = 0
  231. ORDER BY A.name, B.name, C.index_id
  232.  
  233. SELECT  @Schema = A.[Schema],
  234.         @Table = A.[Table],
  235.         @Index = A.[Index]
  236. FROM    #DeleteIndex A
  237.  
  238. WHILE @@ROWCOUNT <> 0
  239. BEGIN
  240.     SET ROWCOUNT 0
  241.    
  242.     PRINT 'Dropping Index ''' + @Index + ''' on [' + @Schema + '].[' + @Table + ']'
  243.    
  244.     SET @Sql = 'DROP INDEX ' + @Index + ' ON [' + @Schema + '].[' + @Table + ']'
  245.    
  246.     EXEC(@sql)
  247.    
  248.     DELETE FROM #DeleteIndex
  249.     WHERE       [Schema] = @Schema
  250.     AND         [Table] = @Table
  251.     AND         [Index] = @Index
  252.  
  253.     SELECT  @Schema = A.[Schema],
  254.             @Table = A.[Table],
  255.             @Index = A.[Index]
  256.     FROM    #DeleteIndex A
  257. END
  258.  
  259. DROP TABLE #DeleteIndex
  260.  
  261. PRINT CONVERT(VARCHAR, GETDATE()) + ': Retrieving tables for processing!'
  262.        
  263. SELECT  *
  264. INTO    #Tables
  265. FROM    INFORMATION_SCHEMA.TABLES A
  266. WHERE 'geometry' IN (SELECT DATA_TYPE
  267.                     FROM    INFORMATION_SCHEMA.COLUMNS B
  268.                     WHERE   B.TABLE_CATALOG = A.TABLE_CATALOG
  269.                     AND     B.TABLE_SCHEMA = A.TABLE_SCHEMA
  270.                     AND     B.TABLE_NAME = A.TABLE_NAME)
  271.        
  272. SELECT  @Catalog = A.TABLE_CATALOG,
  273.         @Schema = A.TABLE_SCHEMA,
  274.         @Table = A.TABLE_NAME
  275. FROM    #Tables A
  276.  
  277. WHILE @@ROWCOUNT <> 0
  278. BEGIN
  279.     SET ROWCOUNT 0
  280.  
  281.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Processing Table [' + @Table + ']'
  282.    
  283.     IF EXISTS (SELECT   1
  284.                 FROM    INFORMATION_SCHEMA.COLUMNS A
  285.                 WHERE   A.TABLE_CATALOG = @Catalog
  286.                 AND     A.TABLE_SCHEMA = @Schema
  287.                 AND     A.TABLE_NAME = @Table
  288.                 AND     A.COLUMN_NAME = 'POINTGEOM')
  289.     BEGIN
  290.         PRINT CONVERT(VARCHAR, GETDATE()) + ': Dropping POINTGEOM column from [' + @Table + ']'
  291.         SET @Sql = 'ALTER TABLE [' + @Table + '] DROP COLUMN POINTGEOM'
  292.         EXEC(@Sql)
  293.     END
  294.    
  295.     IF EXISTS (SELECT   1
  296.                 FROM    INFORMATION_SCHEMA.COLUMNS A
  297.                 WHERE   A.TABLE_CATALOG = @Catalog
  298.                 AND     A.TABLE_SCHEMA = @Schema
  299.                 AND     A.TABLE_NAME = @Table
  300.                 AND     A.COLUMN_NAME = 'MINLAT')
  301.     BEGIN
  302.         PRINT CONVERT(VARCHAR, GETDATE()) + ': Dropping MINLAT column from [' + @Table + ']'
  303.         SET @Sql = 'ALTER TABLE [' + @Table + '] DROP COLUMN MINLAT'
  304.         EXEC(@Sql)
  305.     END
  306.    
  307.     IF EXISTS (SELECT   1
  308.                 FROM    INFORMATION_SCHEMA.COLUMNS A
  309.                 WHERE   A.TABLE_CATALOG = @Catalog
  310.                 AND     A.TABLE_SCHEMA = @Schema
  311.                 AND     A.TABLE_NAME = @Table
  312.                 AND     A.COLUMN_NAME = 'MINLONG')
  313.     BEGIN
  314.         PRINT CONVERT(VARCHAR, GETDATE()) + ': Dropping MINLONG column from [' + @Table + ']'
  315.         SET @Sql = 'ALTER TABLE [' + @Table + '] DROP COLUMN MINLONG'
  316.         EXEC(@Sql)
  317.     END
  318.    
  319.     IF EXISTS (SELECT   1
  320.                 FROM    INFORMATION_SCHEMA.COLUMNS A
  321.                 WHERE   A.TABLE_CATALOG = @Catalog
  322.                 AND     A.TABLE_SCHEMA = @Schema
  323.                 AND     A.TABLE_NAME = @Table
  324.                 AND     A.COLUMN_NAME = 'MAXLAT')
  325.     BEGIN
  326.         PRINT CONVERT(VARCHAR, GETDATE()) + ': Dropping MAXLAT column from [' + @Table + ']'
  327.         SET @Sql = 'ALTER TABLE [' + @Table + '] DROP COLUMN MAXLAT'
  328.         EXEC(@Sql)
  329.     END
  330.    
  331.     IF EXISTS (SELECT   1
  332.                 FROM    INFORMATION_SCHEMA.COLUMNS A
  333.                 WHERE   A.TABLE_CATALOG = @Catalog
  334.                 AND     A.TABLE_SCHEMA = @Schema
  335.                 AND     A.TABLE_NAME = @Table
  336.                 AND     A.COLUMN_NAME = 'MAXLONG')
  337.     BEGIN
  338.         PRINT CONVERT(VARCHAR, GETDATE()) + ': Dropping MAXLONG column from [' + @Table + ']'
  339.         SET @Sql = 'ALTER TABLE [' + @Table + '] DROP COLUMN MAXLONG'
  340.         EXEC(@Sql)
  341.     END
  342.  
  343.     DECLARE @GeomColumn VARCHAR(1024) = (SELECT TOP 1 A.COLUMN_NAME
  344.                                             FROM    INFORMATION_SCHEMA.COLUMNS A
  345.                                             WHERE   A.TABLE_CATALOG = @Catalog
  346.                                             AND     A.TABLE_SCHEMA = @Schema
  347.                                             AND     A.TABLE_NAME = @Table
  348.                                             AND     A.DATA_TYPE = 'geometry'),
  349.             @LongColumn VARCHAR(1024),
  350.             @LatColumn VARCHAR(1024)
  351.  
  352.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Applying MakeValid to [' + @GeomColumn + '] column'
  353.    
  354.     SET @SQL = 'UPDATE [' + @Catalog + '].[' + @Schema + '].[' + @Table + '] SET [' + @GeomColumn + '] = [' + @GeomColumn + '].MakeValid()'
  355.    
  356.     EXEC (@SQL)
  357.    
  358.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Adding MINLONG column to [' + @Table + ']'
  359.    
  360.     SET @Sql = 'ALTER TABLE [' + @Catalog + '].[' + @Schema + '].[' + @Table + ']' + @NewLineChar
  361.             + 'ADD [MINLONG] AS [' + @GeomColumn + '].STEnvelope().STPointN((1)).STX PERSISTED  NOT NULL'
  362.    
  363.     EXEC(@Sql)
  364.    
  365.     PRINT CONVERT(VARCHAR, GETDATE()) + ': MINLONG column added to [' + @Table + ']'
  366.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Adding MINLAT column to [' + @Table + ']'
  367.    
  368.     SET @Sql = 'ALTER TABLE [' + @Catalog + '].[' + @Schema + '].[' + @Table + ']' + @NewLineChar
  369.             + 'ADD [MINLAT] AS [' + @GeomColumn + '].STEnvelope().STPointN((1)).STY PERSISTED       NOT NULL'
  370.    
  371.     EXEC(@Sql)
  372.    
  373.     PRINT CONVERT(VARCHAR, GETDATE()) + ': MINLAT column added to [' + @Table + ']'
  374.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Adding MAXLONG column to [' + @Table + ']'
  375.    
  376.     SET @Sql = 'ALTER TABLE [' + @Catalog + '].[' + @Schema + '].[' + @Table + ']' + @NewLineChar
  377.             + 'ADD [MAXLONG] AS [' + @GeomColumn + '].STEnvelope().STPointN((3)).STX PERSISTED  NOT NULL'
  378.  
  379.     EXEC(@Sql)
  380.        
  381.     PRINT CONVERT(VARCHAR, GETDATE()) + ': MAXLONG column added to [' + @Table + ']'
  382.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Adding MAXLAT column to [' + @Table + ']'
  383.    
  384.     SET @Sql = 'ALTER TABLE [' + @Catalog + '].[' + @Schema + '].[' + @Table + ']' + @NewLineChar
  385.             + 'ADD [MAXLAT] AS [' + @GeomColumn + '].STEnvelope().STPointN((3)).STY PERSISTED       NOT NULL'
  386.    
  387.     EXEC(@Sql)
  388.    
  389.     PRINT CONVERT(VARCHAR, GETDATE()) + ': MAXLAT column added to [' + @Table + ']'
  390.            
  391.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Creating index on bounding box coordinates!'
  392.            
  393.     SET @Sql = 'CREATE INDEX idx_' + @Table + '_MINLONG_MINLAT_MAXLONG_MAXLAT ON [' + @Table + ']([MINLONG], [MINLAT], [MAXLONG], [MAXLAT])'
  394.            
  395.     EXEC(@Sql)
  396.  
  397.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Bounding Box index created!'
  398.    
  399.     IF EXISTS (SELECT   1
  400.                 FROM    INFORMATION_SCHEMA.COLUMNS A
  401.                 WHERE   A.TABLE_CATALOG = @Catalog
  402.                 AND     A.TABLE_SCHEMA = @Schema
  403.                 AND     A.TABLE_NAME = @Table
  404.                 AND     A.COLUMN_NAME LIKE '%LATITUDE%')
  405.     BEGIN
  406.         IF EXISTS (SELECT   1
  407.                     FROM    INFORMATION_SCHEMA.COLUMNS A
  408.                     WHERE   A.TABLE_CATALOG = @Catalog
  409.                     AND     A.TABLE_SCHEMA = @Schema
  410.                     AND     A.TABLE_NAME = @Table
  411.                     AND     A.COLUMN_NAME LIKE '%LONGITUDE%')
  412.         BEGIN
  413.             PRINT CONVERT(VARCHAR, GETDATE()) + ': Latitude and Longitude columns detected!'
  414.  
  415.             SET @LongColumn = (SELECT TOP 1 A.COLUMN_NAME
  416.                                 FROM    INFORMATION_SCHEMA.COLUMNS A
  417.                                 WHERE   A.TABLE_CATALOG = @Catalog
  418.                                 AND     A.TABLE_SCHEMA = @Schema
  419.                                 AND     A.TABLE_NAME = @Table
  420.                                 AND     A.COLUMN_NAME LIKE '%LONGITUDE%')
  421.            
  422.             SET @LatColumn = (SELECT TOP 1 A.COLUMN_NAME
  423.                                 FROM    INFORMATION_SCHEMA.COLUMNS A
  424.                                 WHERE   A.TABLE_CATALOG = @Catalog
  425.                                 AND     A.TABLE_SCHEMA = @Schema
  426.                                 AND     A.TABLE_NAME = @Table
  427.                                 AND     A.COLUMN_NAME LIKE '%LATITUDE')
  428.  
  429.             PRINT CONVERT(VARCHAR, GETDATE()) + ': Creating POINTGEOM column on [' + @Table + ']'
  430.            
  431.             SET @Sql = 'ALTER TABLE [' + @Catalog + '].[' + @Schema + '].[' + @Table + '] ADD [POINTGEOM] AS GEOMETRY::Point([' + @LongColumn + '], [' + @LatColumn + '], [' + @GeomColumn + '].STSrid) PERSISTED NOT NULL'
  432.                
  433.             EXEC(@Sql)
  434.                
  435.             PRINT CONVERT(VARCHAR, GETDATE()) + ': POINTGEOM column created.'
  436.            
  437.             PRINT CONVERT(VARCHAR, GETDATE()) + ': Creating index on latitude and longitude!'
  438.            
  439.             SET @Sql = 'CREATE INDEX idx_' + @Table + '_' + @LongColumn + '_' + @LatColumn + ' ON [' + @Table + ']([' + @LongColumn + '], [' + @LatColumn + '])'
  440.            
  441.             EXEC(@Sql)
  442.  
  443.             PRINT CONVERT(VARCHAR, GETDATE()) + ': Latitude and Longitude index created!'
  444.  
  445.             PRINT CONVERT(VARCHAR, GETDATE()) + ': Creating Spatial index on POINTGEOM column!'
  446.                
  447.             SET @Sql = 'DECLARE @MINLAT FLOAT, @MINLONG FLOAT, @MAXLAT FLOAT, @MAXLONG FLOAT, @Sql VARCHAR(MAX)' + @NewLineChar
  448.                         + 'SELECT @MINLAT = MIN([' + @LatColumn + ']), @MINLONG = MIN([' + @LongColumn + ']), @MAXLAT = MAX([' + @LatColumn + ']), @MAXLONG = MAX([' + @LongColumn + ']) FROM [' + @Catalog + '].[' + @Schema + '].[' + @Table + '] A' + @NewLineChar
  449.                         + 'SET @Sql = ''CREATE SPATIAL INDEX idx_' + @Table + '_POINTGEOM ON [' + @Catalog + '].[' + @Schema + '].[' + @Table + '] ([POINTGEOM]) WITH ( BOUNDING_BOX = ( '' + CONVERT(VARCHAR, @MINLONG) + '', '' + CONVERT(VARCHAR, @MINLAT) + '', '' + CONVERT(VARCHAR, @MAXLONG) + '', '' + CONVERT(VARCHAR, @MAXLAT) + ''), GRIDS =(LEVEL_1 = HIGH, LEVEL_2 = HIGH, LEVEL_3 = HIGH, LEVEL_4 = HIGH), CELLS_PER_OBJECT = 16)''' + @NewLineChar
  450.                         + 'EXEC(@Sql)'
  451.                                                  
  452.             EXEC(@Sql)
  453.                
  454.             PRINT CONVERT(VARCHAR, GETDATE()) + ': Spatial Index Created on POINTGEOM column'
  455.         END
  456.     END
  457.  
  458.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Creating Spatial index on [' + @GeomColumn + ']'
  459.                
  460.     SET @Sql = 'DECLARE @MINLAT FLOAT, @MINLONG FLOAT, @MAXLAT FLOAT, @MAXLONG FLOAT, @Sql VARCHAR(MAX)' + @NewLineChar
  461.                 + 'SELECT @MINLAT = MIN(A.MINLAT), @MINLONG = MIN(A.MINLONG), @MAXLAT = MAX(A.MAXLAT), @MAXLONG = MAX(A.MAXLONG) FROM [' + @Catalog + '].[' + @Schema + '].[' + @Table + '] A' + @NewLineChar
  462.                 + 'SET @Sql = ''CREATE SPATIAL INDEX idx_' + @Table + '_' + @GeomColumn + ' ON [' + @Catalog + '].[' + @Schema + '].[' + @Table + '] ([' + @GeomColumn + ']) WITH ( BOUNDING_BOX = ( '' + CONVERT(VARCHAR, @MINLONG) + '', '' + CONVERT(VARCHAR, @MINLAT) + '', '' + CONVERT(VARCHAR, @MAXLONG) + '', '' + CONVERT(VARCHAR, @MAXLAT) + ''), GRIDS =(LEVEL_1 = HIGH, LEVEL_2 = HIGH, LEVEL_3 = HIGH, LEVEL_4 = HIGH), CELLS_PER_OBJECT = 16)''' + @NewLineChar
  463.                 + 'EXEC(@Sql)'
  464.                                                  
  465.     EXEC(@Sql)
  466.  
  467.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Spatial Index Created on [' + @GeomColumn + '] column'
  468.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Consuming #Tables record'
  469.  
  470.     DELETE  #Tables
  471.     WHERE   TABLE_CATALOG = @Catalog
  472.     AND     TABLE_SCHEMA = @Schema
  473.     AND     TABLE_NAME = @Table
  474.        
  475.     SELECT  @Catalog = A.TABLE_CATALOG,
  476.             @Schema = A.TABLE_SCHEMA,
  477.             @Table = A.TABLE_NAME
  478.     FROM    #Tables A  
  479. END
  480.  
  481. DROP TABLE #Tables
  482.  
  483. PRINT CONVERT(VARCHAR, GETDATE()) + ': Script finished!'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement