Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2017
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 5.30 KB | None | 0 0
  1. SET ANSI_NULLS ON
  2. GO
  3. SET QUOTED_IDENTIFIER ON
  4. GO
  5. -- =============================================
  6. -- Author:      Author          Rui Borges
  7. -- Create date: Create Date     2017-01-20
  8. -- Description: Description     Metadados-Criação de SPs de manipulação de tabela
  9. -- =============================================
  10.  
  11. alter PROCEDURE sp_generate_sql_tabela_update (
  12.     @tabela        nvarchar(128)
  13. )
  14. AS
  15.     declare @tab_c  nvarchar(128);
  16.     declare @col_t  nvarchar(128);
  17.     declare @col_l  nvarchar(128);
  18.     declare @col_p  nvarchar(128);
  19.     declare @pos    int = 0;
  20.     declare @pks    int = 0;
  21.     declare @crlf   nchar(2) = CHAR(13) + CHAR(10);
  22.  
  23.  
  24.     DECLARE @sp_header         NVARCHAR(MAX) = '';
  25.     DECLARE @sp_header_action  NVARCHAR(500) = '';
  26.     DECLARE @sp_columns        NVARCHAR(MAX) = '';
  27.     DECLARE @sp_args           NVARCHAR(MAX) = '';
  28.     DECLARE @sp_update         NVARCHAR(MAX) = '';
  29.     DECLARE @sp_where          NVARCHAR(MAX) = '';
  30.     DECLARE @sp_key            NVARCHAR(128) = '';
  31.     DECLARE @sp_linha          NVARCHAR(500) = '';
  32.     DECLARE @sp_all            NVARCHAR(MAX) = '';
  33.  
  34.     -- Determinar a primary key
  35.     SELECT @pks = count(*)
  36.         FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS A, INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE B
  37.         WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
  38.         AND A.TABLE_NAME = @tabela;
  39.  
  40.     if @pks < 1
  41.         begin
  42.             raiserror (50011, 16, -1, '@sp_key', 'sp_generate_sql_tabela_update')
  43.             return (1)
  44.         end
  45.  
  46.     SELECT @sp_header = '-- ============================================= ' + @crlf
  47.                       + '-- Author:        Author           Rui Borges    ' + @crlf
  48.                       + '-- Create date:   Create Date  ' + REPLACE(CONVERT(CHAR(10), CONVERT (date, GETDATE()), 103), '-','') +@crlf
  49.                       + '-- Description:   Description  Metadados - Criação de SPs de manipulação de tabela ' + @crlf
  50.                       + '-- ============================================= '  + @crlf;
  51.  
  52.     SELECT @sp_header_action = '-- U P D A T E '  + @crlf
  53.                              + 'CREATE PROCEDURE [dbo].sp_' + @tabela + '_update ('  + @crlf;
  54.  
  55.     SELECT @sp_update =  @crlf +  @crlf + 'UPDATE [dbo].' + @tabela + ' SET '+ @crlf;
  56.  
  57.     SELECT @sp_where =  @crlf  + '   WHERE ' + @crlf;
  58.  
  59.     select @sp_columns = @sp_header + @sp_header_action;
  60.  
  61.  
  62. BEGIN
  63.     SET NOCOUNT ON;
  64.    
  65.     -- Cursor para obter informação sobre as colunas da tabela para os argumentos
  66.     DECLARE #curInfoTab CURSOR LOCAL FAST_FORWARD FOR
  67.         SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION
  68.             FROM testedb.INFORMATION_SCHEMA.COLUMNS
  69.             WHERE TABLE_NAME = @tabela;
  70.  
  71.     OPEN #curInfoTab
  72.  
  73.     FETCH #curInfoTab INTO @tab_c, @col_t, @col_l, @col_p
  74.        
  75.     WHILE (@@FETCH_STATUS = 0)
  76.     BEGIN
  77.        
  78.         if @pos > 0
  79.           begin
  80.               set @sp_linha = ', ' + @crlf;
  81.           end;
  82.  
  83.         -- Argumentos
  84.         set @sp_linha = @sp_linha + '     @p_' + @tab_c + '     ' + @col_t ;
  85.         if @col_t = 'nchar' or @col_t = 'nvarchar' or @col_t = 'varchar'
  86.               set @sp_linha = @sp_linha + '(' + @col_l + ')';
  87.  
  88.         set  @sp_args = @sp_args + @sp_linha;
  89.  
  90.         set @pos = @pos + 1;
  91.  
  92.         FETCH #curInfoTab INTO @tab_c, @col_t, @col_l, @col_p
  93.     END
  94.     CLOSE #curInfoTab;  
  95.     DEALLOCATE #curInfoTab;
  96.  
  97.     -- Cursor para obter informação sobre as colunas da tabela para o update
  98.     DECLARE #curInfoCol CURSOR LOCAL FAST_FORWARD FOR
  99.         SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION
  100.             FROM INFORMATION_SCHEMA.COLUMNS
  101.             WHERE TABLE_NAME = @tabela
  102.               AND COLUMN_NAME not in (
  103.                     SELECT B.COLUMN_NAME
  104.                       FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS A, INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE B
  105.                      WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
  106.                        AND A.TABLE_NAME = @tabela
  107.                 );
  108.  
  109.     set @pos = 0;
  110.  
  111.     OPEN #curInfoCol
  112.  
  113.     FETCH #curInfoCol INTO @tab_c, @col_t, @col_l, @col_p
  114.        
  115.     WHILE (@@FETCH_STATUS = 0)
  116.     BEGIN
  117.        
  118.         if @pos > 0
  119.           begin
  120.               set @sp_update = @sp_update + ', ' + @crlf;
  121.           end;
  122.  
  123.         -- Campos no comando Update
  124.         set @sp_update = @sp_update + '    ' + @tab_c + ' = @p_' + @tab_c;
  125.  
  126.         set @pos = @pos + 1;
  127.  
  128.         FETCH #curInfoCol INTO @tab_c, @col_t, @col_l, @col_p
  129.     END
  130.     CLOSE #curInfoCol;  
  131.     DEALLOCATE #curInfoCol;
  132.  
  133.     -- Cursor para obter informação sobre as colunas chave da tabela
  134.     DECLARE #curInfoKey CURSOR LOCAL FAST_FORWARD FOR
  135.         SELECT  COLUMN_NAME
  136.                 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS A, INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE B
  137.                 WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
  138.                 AND A.TABLE_NAME = @tabela;
  139.                
  140.     set @pos = 0;
  141.  
  142.     OPEN #curInfoKey
  143.  
  144.     FETCH #curInfoKey INTO @tab_c
  145.        
  146.     WHILE (@@FETCH_STATUS = 0)
  147.     BEGIN
  148.        
  149.         if @pos > 0
  150.           begin
  151.               set @sp_where = @sp_where + ', ' + @crlf;
  152.           end;
  153.  
  154.         -- Campos da clausula where
  155.         set @sp_where = @sp_where + '    ' + @tab_c + ' = @p_' + @tab_c;
  156.  
  157.         set @pos = @pos + 1;
  158.  
  159.         FETCH #curInfoKey INTO @tab_c
  160.     END
  161.     CLOSE #curInfoKey;  
  162.     DEALLOCATE #curInfoKey;
  163.  
  164.     set @sp_args   = @sp_args + @crlf  + '  ) ' + @crlf + '  AS ' + @crlf;
  165.     set @sp_all    = @sp_columns + @sp_args + @sp_update +  @crlf;
  166.     set @sp_all    = @sp_all + @sp_where +  @crlf;
  167.     set @sp_all    = @sp_all + 'COMMIT;  '  + @crlf;
  168.  
  169.     --print @sp_all;
  170.     exec(@sp_all);
  171.  
  172. END
  173. GO
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement