Guest User

Untitled

a guest
Jun 14th, 2018
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.62 KB | None | 0 0
  1. /****** Object: StoredProcedure [dbo].[sp_Get_Product_Temps] Script Date: 6/12/2018 1:13:12 PM ******/
  2. SET ANSI_NULLS ON
  3. GO
  4.  
  5. SET QUOTED_IDENTIFIER ON
  6. GO
  7.  
  8. -- =============================================
  9. -- Author: Samara Duncan
  10. -- Create date: June 12, 2018
  11. -- Description: Sets up an external data source based on DB name
  12. -- =============================================
  13. CREATE PROCEDURE [dbo].[sp_Setup_External_DataSource]
  14. @ExternalDB nvarchar(50),
  15. @ExternalServer varchar(100),
  16. @UserName varchar(50),
  17. @Password varchar(50)
  18. AS
  19. BEGIN
  20. SET NOCOUNT ON;
  21.  
  22. --create external credential
  23. IF EXISTS (Select 1 FROM sys.database_scoped_credentials where name = @ExternalDB + '_Credential')
  24. BEGIN
  25. Print 'Credentials Exist'
  26. END
  27. ELSE BEGIN
  28. Print 'Creating Credentials'
  29. IF @UserName IS NULL OR @UserName = ''
  30. BEGIN
  31. Print 'Cannot Create Credential Without Password'
  32. RETURN
  33. END
  34. ELSE IF @Password IS NULL OR @Password = ''
  35. BEGIN
  36. Print 'Cannot Create Credential Without Password'
  37. RETURN
  38. END
  39. ELSE
  40. BEGIN
  41. EXEC('
  42. CREATE DATABASE SCOPED CREDENTIAL ['+ @ExternalDB + '_Credential]
  43. WITH IDENTITY = ''' + @UserName + ''',
  44. SECRET = ''' + @Password + ''';
  45. ');
  46. END
  47. END
  48.  
  49. --create external data source
  50. IF EXISTS (Select 1 FROM sys.external_data_sources where name = @ExternalDB)
  51. BEGIN
  52. Print 'Data Source Exists'
  53. END
  54. ELSE BEGIN
  55. Print 'Creating Data Source'
  56. EXEC('
  57. CREATE EXTERNAL DATA SOURCE [' + @ExternalDB +']
  58. WITH (
  59. TYPE = RDBMS,
  60. LOCATION = ''' + @ExternalServer + ''',
  61. DATABASE_NAME = ''' + @ExternalDB + ''',
  62. CREDENTIAL = ['+@ExternalDB + '_Credential]
  63. )
  64. ');
  65. END
  66. END
  67. GO
  68.  
  69. CREATE PROCEDURE [dbo].[sp_Setup_External_Schema]
  70. @LocalSchema varchar(20),
  71. @ExternalSchema varchar(20),
  72. @ExternalDB nvarchar(50),
  73. @ExternalSystemTable varchar(50) = NULL --Only set if you don't want to use the default name
  74. AS
  75. BEGIN
  76. SET NOCOUNT ON;
  77.  
  78. DECLARE @sql nvarchar(MAX)
  79.  
  80. IF @ExternalSystemTable IS NULL OR @ExternalSystemTable = ''
  81. SET @ExternalSystemTable = @ExternalSchema + '_SystemView'
  82.  
  83. --creating schema if necessary
  84. IF EXISTS (SELECT name FROM sys.schemas WHERE name = @LocalSchema)
  85. BEGIN
  86. Print 'Schema exists';
  87. END
  88. ELSE
  89. BEGIN
  90. EXEC('CREATE SCHEMA ' + @LocalSchema)
  91. Print 'Creating migration schema'
  92. END
  93. END
  94.  
  95. GO
  96.  
  97. CREATE PROCEDURE [dbo].[sp_Setup_External_System_Table]
  98. @LocalSchema varchar(20),
  99. @ExternalSchema varchar(20),
  100. @ExternalDB nvarchar(50),
  101. @ExternalSystemTable varchar(50) = NULL --Only set if you don't want to use the default name
  102. AS
  103. BEGIN
  104.  
  105. DECLARE @sql nvarchar(MAX)
  106. --Create External Table to generate schema
  107. IF EXISTS (Select Top 1 1 FROM sys.external_tables WHERE name = @ExternalSystemTable)
  108. BEGIN
  109. PRINT 'System Table Exists'
  110. END
  111. ELSE
  112. BEGIN
  113. PRINT 'Creating system external view'
  114.  
  115. SET @sql = N'
  116. DROP VIEW IF EXISTS ['+@ExternalSchema+'].[SystemView]'
  117.  
  118. EXEC sp_execute_remote @data_source_name = @ExternalDB, @stmt = @sql
  119.  
  120. SET @sql = N'
  121. CREATE VIEW ['+@ExternalSchema+'].[SystemView]
  122. AS SELECT c.NAME AS ColumnName,
  123. tp.NAME AS ColumnType,
  124. CASE WHEN tp.NAME IN (''varchar'', ''char'', ''varbinary'', ''binary'') THEN ''('' +
  125. CASE WHEN c.max_length = -1
  126. THEN ''MAX''
  127. ELSE cast(c.max_length AS varchar(5))
  128. END + '')''
  129. WHEN tp.NAME IN (''nvarchar'', ''nchar'')
  130. THEN ''('' +
  131. CASE WHEN c.max_length = -1
  132. THEN ''MAX''
  133. ELSE cast(c.max_length / 2 AS varchar(5))
  134. END + '')''
  135. WHEN tp.NAME IN (''datetime2'', ''time2'', ''datetimeoffset'')
  136. THEN ''('' + cast(c.scale AS varchar(5)) + '')''
  137. WHEN tp.NAME = ''decimal''
  138. THEN ''('' + cast(c.[precision] AS varchar(5)) + '','' + cast(c.scale AS varchar(5)) + '')''
  139. ELSE ''''
  140. END AS ColumnTypeSuffix,
  141. c.is_nullable AS IsNullable,
  142. t.NAME AS TableName,
  143. s.NAME AS SchemaName
  144. FROM sys.columns c
  145. INNER JOIN sys.tables t
  146. ON c.object_id = t.object_id
  147. INNER JOIN sys.schemas s
  148. ON t.schema_id = s.schema_id
  149. INNER JOIN sys.types tp
  150. ON c.user_type_id = tp.user_type_id
  151. WHERE s.NAME = ''' + @ExternalSchema + ''''
  152.  
  153. --PRINT @sql
  154.  
  155. EXEC sp_execute_remote @data_source_name = @ExternalDB, @stmt = @sql
  156.  
  157. PRINT 'Creating system external view'
  158.  
  159. SET @sql = 'CREATE EXTERNAL TABLE ['+@LocalSchema+'].['+ @ExternalSystemTable +']
  160. (
  161. ColumnName nvarchar(128),
  162. ColumnType nvarchar(128),
  163. ColumnTypeSuffix varchar(13),
  164. IsNullable bit,
  165. TableName nvarchar(128),
  166. SchemaName nvarchar(128)
  167. )
  168. WITH (DATA_SOURCE = [' + @ExternalDB +'], SCHEMA_NAME = N''' + @ExternalSchema + ''',OBJECT_NAME = N''SystemView'')'
  169.  
  170.  
  171. --PRINT @sql
  172. EXEC(@sql)
  173. END
  174.  
  175. END
  176.  
  177. GO
  178.  
  179. CREATE PROCEDURE [dbo].[sp_Setup_External_Table]
  180. @ExternalSchema varchar(20),
  181. @ExternalTable varchar(20),
  182. @ExternalDB nvarchar(50),
  183. @LocalSchema varchar(20) = NULL, --Defaults to external table schema
  184. @LocalTable varchar(20) = NULL, -- Defaults to external table name
  185. @ExternalSystemTable varchar(50) = NULL --Only set if you don't want to use the default name
  186. AS
  187. BEGIN
  188. DECLARE @sql nvarchar(MAX)
  189.  
  190. --Fill in null variables
  191. IF @LocalTable IS NULL OR @LocalTable = ''
  192. SET @LocalTable = @ExternalTable
  193.  
  194. IF @LocalSchema IS NULL OR @LocalSchema = ''
  195. SET @LocalSchema = @ExternalSchema
  196.  
  197. IF @ExternalSystemTable IS NULL OR @ExternalSystemTable = ''
  198. BEGIN
  199. SET @ExternalSystemTable = @ExternalSchema + '_SystemView'
  200. END
  201.  
  202.  
  203. EXEC('
  204. IF EXISTS (SELECT TOP 1 1 FROM sys.external_tables t
  205. INNER JOIN sys.schemas s
  206. ON t.schema_id = s.schema_id
  207. WHERE t.name = ''' + @LocalTable + '''
  208. AND s.name = ''' + @LocalSchema + ''')
  209. BEGIN
  210. DROP EXTERNAL TABLE [' + @LocalSchema +'].[' + @LocalTable +']
  211. END')
  212.  
  213.  
  214. PRINT 'Creating Table'
  215.  
  216. SET @sql =
  217. 'SELECT @tempOUT = (SELECT
  218. STUFF(( SELECT '', ['' + [ColumnName] + ''] '' + ColumnType + ColumnTypeSuffix + '' ''
  219. FROM [' + @LocalSchema +'].['+ @ExternalSystemTable +']
  220. WHERE [TableName] = ''' + @ExternalTable + '''
  221. FOR XML PATH('''') -- Select it as XML
  222. ), 1, 1, '''' ))'
  223.  
  224.  
  225. DECLARE @temp nvarchar(max)
  226. exec sp_executesql @sql, N'@tempOUT nvarchar(MAX) OUTPUT', @tempOUT = @temp OUTPUT
  227.  
  228.  
  229. SET @sql = '
  230. CREATE EXTERNAL TABLE ['+@LocalSchema+'].['+ @LocalTable +'] (
  231. ' + @temp + '
  232. )WITH (DATA_SOURCE = [' + @ExternalDB +'], SCHEMA_NAME = N''' + @ExternalSchema + ''',OBJECT_NAME = N''' + @ExternalTable + ''')'
  233.  
  234. PRINT @sql
  235. EXEC(@sql)
  236.  
  237. PRINT 'Creation Complete'
  238. END
  239.  
  240.  
  241. GO
  242.  
  243. CREATE PROCEDURE [dbo].[sp_Setup_External_Table_Full_Schema]
  244. @ExternalSchema varchar(20) = 'dbo', --Required, schema of the external table you want to create
  245. @ExternalDB nvarchar(50) = N'', --optional, Required for external data source setup
  246. @ExternalServer varchar(100) = '', --optional, required for external data source setup
  247. @UserName varchar(50) = '', --optional, required for credential setup
  248. @Password varchar(50) = '', --optional, required for credential setup
  249. @LocalSchema varchar(20) = 'migration', --optional, if null external schema will be used
  250. @ExternalSystemTable varchar(50) = '' --optional, if null, external schema will be used to name table
  251.  
  252. AS
  253. BEGIN
  254. DECLARE @sql nvarchar(MAX)
  255.  
  256. IF @ExternalSystemTable IS NULL OR @ExternalSystemTable = ''
  257. BEGIN
  258. SET @ExternalSystemTable = @ExternalSchema + '_SystemView'
  259. END
  260.  
  261. IF EXISTS (Select 1 FROM sys.external_data_sources where name = @ExternalDB)
  262. BEGIN
  263. Print 'Data Source Exists'
  264. END
  265. ELSE BEGIN
  266. EXEC [dbo].[sp_Setup_External_DataSource] @ExternalDB, @ExternalServer, @UserName, @Password
  267. END
  268.  
  269. IF EXISTS (SELECT name FROM sys.schemas WHERE name = @LocalSchema)
  270. BEGIN
  271. Print 'Schema exists';
  272. END
  273. ELSE
  274. BEGIN
  275. EXEC [dbo].[sp_Setup_External_Schema] @LocalSchema, @ExternalSchema, @ExternalDB, @ExternalSystemTable
  276. END
  277.  
  278.  
  279.  
  280. IF EXISTS (Select Top 1 1 FROM sys.external_tables WHERE name = @ExternalSystemTable)
  281. BEGIN
  282. PRINT 'System Table Exists'
  283. END
  284. ELSE
  285. BEGIN
  286. EXEC [dbo].[sp_Setup_External_System_Table] @LocalSchema, @ExternalSchema, @ExternalDB, @ExternalSystemTable
  287. END
  288.  
  289. DECLARE @TableNames TABLE (TableName nvarchar(50))
  290.  
  291. SET @sql = '
  292. SELECT DISTINCT [TableName]
  293. FROM [' + @LocalSchema + '].[' + @ExternalSystemTable + ']'
  294.  
  295. INSERT @TableNames EXEC(@sql)
  296.  
  297. DECLARE @TableName SYSNAME
  298.  
  299. DECLARE TableCursor CURSOR FOR
  300. SELECT TableName FROM @TableNames
  301.  
  302. OPEN TableCursor
  303.  
  304. FETCH NEXT FROM TableCursor
  305. INTO @TableName
  306.  
  307. WHILE @@FETCH_STATUS = 0
  308. BEGIN
  309. EXEC [dbo].[sp_Setup_External_Table] @ExternalSchema, @TableName, @ExternalDB, @LocalSchema, @TableName, @ExternalSystemTable
  310.  
  311. FETCH NEXT FROM TableCursor
  312. INTO @TableName
  313. END
  314.  
  315. CLOSE TableCursor
  316. DEALLOCATE TableCursor
  317.  
  318. END
Add Comment
Please, Sign In to add comment