Skip to content

Instantly share code, notes, and snippets.

@allansli
Created August 31, 2018 13:43
Show Gist options
  • Save allansli/d0e278248752846e86e3fddbd7fd654c to your computer and use it in GitHub Desktop.
Save allansli/d0e278248752846e86e3fddbd7fd654c to your computer and use it in GitHub Desktop.
DECLARE @QUERY_SELECT VARCHAR(MAX);
DECLARE @NOME_TABELA VARCHAR(MAX);
DECLARE @NOME_COLUNA VARCHAR(MAX);
DECLARE @VALOR_COLUNA VARCHAR(MAX);
DECLARE @QUERY_WHERE VARCHAR(MAX);
DECLARE @COLUNA_CHAVE VARCHAR(1);
DECLARE @COLUNA_EDITAVEL VARCHAR(1);
DECLARE @TIPO_COLUNA VARCHAR(MAX);
DECLARE @TEM_FILTRO BIT;
DECLARE @VALOR_NUMERICO VARCHAR(MAX);
IF (@TIPO_EXEC = 1) --SELECT
BEGIN
SET @QUERY_SELECT = 'SELECT TOP 100 ';
SET @QUERY_WHERE = ' WHERE ';
SET @TEM_FILTRO = 0;
DECLARE XML_CURSOR CURSOR FAST_FORWARD FOR
SELECT NOME_TABELA = T.Item.value('../../@NOME', 'varchar(MAX)'),
NOME_COLUNA = T.Item.value('../@NOME' , 'varchar(MAX)'),
VALOR_COLUNA = T.Item.value('../@VALOR' , 'varchar(MAX)'),
COLUNA_EDITAVEL = T.Item.value('../@EDITAVEL' , 'varchar(MAX)'),
COLUNA_CHAVE = T.Item.value('../@CHAVE_PRIMARIA' , 'varchar(MAX)'),
TIPO_COLUNA = T.Item.value('@TIPO' , 'varchar(MAX)')
FROM @XML_INPUT.nodes('//TABELA/COLUNA/TIPO') AS T(Item);
OPEN XML_CURSOR;
FETCH NEXT FROM XML_CURSOR
INTO
@NOME_TABELA, @NOME_COLUNA, @VALOR_COLUNA, @COLUNA_EDITAVEL, @COLUNA_CHAVE, @TIPO_COLUNA;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @QUERY_SELECT = @QUERY_SELECT + @NOME_COLUNA + ', '
IF(@TIPO_COLUNA <> 'xml' AND @VALOR_COLUNA <> '')
BEGIN
SET @QUERY_WHERE = @QUERY_WHERE + @NOME_COLUNA + ' = ''' + @VALOR_COLUNA + ''' AND '
SET @TEM_FILTRO = 1
END
FETCH NEXT FROM XML_CURSOR
INTO
@NOME_TABELA, @NOME_COLUNA, @VALOR_COLUNA, @COLUNA_EDITAVEL, @COLUNA_CHAVE, @TIPO_COLUNA;
END;
CLOSE XML_CURSOR;
DEALLOCATE XML_CURSOR;
SELECT @QUERY_SELECT = LEFT(@QUERY_SELECT, LEN(@QUERY_SELECT) - 1);
SET @QUERY_SELECT = @QUERY_SELECT + ' FROM ' + @NOME_TABELA + ' WITH (NOLOCK)';
IF (@TEM_FILTRO = 1)
BEGIN
SELECT @QUERY_WHERE = LEFT(@QUERY_WHERE, len(@QUERY_WHERE) - 4);
SET @QUERY_SELECT = @QUERY_SELECT + @QUERY_WHERE
END
EXEC(@QUERY_SELECT);
--PRINT @QUERY_SELECT
END
ELSE IF (@TIPO_EXEC = 2) --INSERT
BEGIN
DECLARE @QUERY_INSERT VARCHAR(MAX)
DECLARE @QUERY_INSERT_1 VARCHAR(MAX)
DECLARE @QUERY_INSERT_2 VARCHAR(MAX)
DECLARE @QUERY_INSERT_3 VARCHAR(MAX)
SET @QUERY_INSERT_1 = 'INSERT INTO '
SET @QUERY_INSERT_2 = ' ('
SET @QUERY_INSERT_3 = ' VALUES ('
DECLARE XML_CURSOR CURSOR FAST_FORWARD FOR
SELECT NOME_TABELA = T.Item.value('../../@NOME', 'varchar(MAX)'),
NOME_COLUNA = T.Item.value('../@NOME' , 'varchar(MAX)'),
VALOR_COLUNA = T.Item.value('../@VALOR' , 'varchar(MAX)'),
COLUNA_EDITAVEL = T.Item.value('../@EDITAVEL' , 'varchar(MAX)'),
COLUNA_CHAVE = T.Item.value('../@CHAVE_PRIMARIA' , 'varchar(MAX)'),
TIPO_COLUNA = T.Item.value('@TIPO' , 'varchar(MAX)')
FROM @XML_INPUT.nodes('//TABELA/COLUNA/TIPO') AS T(Item);
OPEN XML_CURSOR;
FETCH NEXT FROM XML_CURSOR
INTO
@NOME_TABELA, @NOME_COLUNA, @VALOR_COLUNA, @COLUNA_EDITAVEL, @COLUNA_CHAVE, @TIPO_COLUNA;
WHILE @@FETCH_STATUS = 0
BEGIN
IF(@TIPO_COLUNA <> 'timestamp')
BEGIN
IF (LTRIM(RTRIM(@VALOR_COLUNA)) = '')
BEGIN
SET @VALOR_NUMERICO = 'NULL'
END
ELSE
BEGIN
SET @VALOR_NUMERICO = @VALOR_COLUNA
END
IF(@COLUNA_EDITAVEL = 'S')
BEGIN
SET @QUERY_INSERT_2 = @QUERY_INSERT_2 + @NOME_COLUNA + ', '
IF((@TIPO_COLUNA = 'int' OR @TIPO_COLUNA = 'decimal'))
BEGIN
SET @QUERY_INSERT_3 = @QUERY_INSERT_3 + @VALOR_NUMERICO + ', '
END
ELSE
BEGIN
SET @QUERY_INSERT_3 = @QUERY_INSERT_3 + '''' + @VALOR_COLUNA + '''' + ', '
END
END
END
FETCH NEXT FROM XML_CURSOR
INTO
@NOME_TABELA, @NOME_COLUNA, @VALOR_COLUNA, @COLUNA_EDITAVEL, @COLUNA_CHAVE, @TIPO_COLUNA;
END;
CLOSE XML_CURSOR;
DEALLOCATE XML_CURSOR;
SELECT @QUERY_INSERT_2 = LEFT(@QUERY_INSERT_2, LEN(@QUERY_INSERT_2) - 1)
SELECT @QUERY_INSERT_3 = LEFT(@QUERY_INSERT_3, LEN(@QUERY_INSERT_3) - 1)
SET @QUERY_INSERT_2 = @QUERY_INSERT_2 + ')'
SET @QUERY_INSERT_1 = @QUERY_INSERT_1 + @NOME_TABELA
SET @QUERY_INSERT_3 = @QUERY_INSERT_3 + ')'
SET @QUERY_INSERT = @QUERY_INSERT_1 + @QUERY_INSERT_2 + @QUERY_INSERT_3
EXEC(@QUERY_INSERT)
--PRINT @QUERY_INSERT
END
ELSE IF (@TIPO_EXEC = 3) --DELETE
BEGIN
DECLARE @QUERY_DELETE VARCHAR(MAX)
DECLARE @QUERY_DELETE_1 VARCHAR(MAX)
DECLARE @QUERY_DELETE_2 VARCHAR(MAX)
SET @QUERY_DELETE_1 = 'DELETE FROM '
SET @QUERY_DELETE_2 = ' WHERE '
DECLARE XML_CURSOR CURSOR FAST_FORWARD FOR
SELECT NOME_TABELA = T.Item.value('../../@NOME', 'varchar(MAX)'),
NOME_COLUNA = T.Item.value('../@NOME' , 'varchar(MAX)'),
VALOR_COLUNA = T.Item.value('../@VALOR' , 'varchar(MAX)'),
COLUNA_EDITAVEL = T.Item.value('../@EDITAVEL' , 'varchar(MAX)'),
COLUNA_CHAVE = T.Item.value('../@CHAVE_PRIMARIA' , 'varchar(MAX)'),
TIPO_COLUNA = T.Item.value('@TIPO' , 'varchar(MAX)')
FROM @XML_INPUT.nodes('//TABELA/COLUNA/TIPO') AS T(Item);
OPEN XML_CURSOR;
FETCH NEXT FROM XML_CURSOR
INTO
@NOME_TABELA, @NOME_COLUNA, @VALOR_COLUNA, @COLUNA_EDITAVEL, @COLUNA_CHAVE, @TIPO_COLUNA;
WHILE @@FETCH_STATUS = 0
BEGIN
IF (LTRIM(RTRIM(@VALOR_COLUNA)) = '')
BEGIN
SET @VALOR_NUMERICO = 'NULL'
END
ELSE
BEGIN
SET @VALOR_NUMERICO = @VALOR_COLUNA
END
IF(@COLUNA_EDITAVEL = 'N' OR @COLUNA_CHAVE = 'S')
BEGIN
IF((@TIPO_COLUNA = 'int' OR @TIPO_COLUNA = 'decimal'))
BEGIN
SET @QUERY_DELETE_2 = @QUERY_DELETE_2 + @NOME_COLUNA + ' = ' + @VALOR_NUMERICO + ' AND '
END
ELSE
BEGIN
SET @QUERY_DELETE_2 = @QUERY_DELETE_2 + @NOME_COLUNA + ' = ' + '''' + @VALOR_COLUNA + '''' + ' AND '
END
END
FETCH NEXT FROM XML_CURSOR
INTO
@NOME_TABELA, @NOME_COLUNA, @VALOR_COLUNA, @COLUNA_EDITAVEL, @COLUNA_CHAVE, @TIPO_COLUNA;
END;
CLOSE XML_CURSOR;
DEALLOCATE XML_CURSOR;
SELECT @QUERY_DELETE_2 = LEFT(@QUERY_DELETE_2, LEN(@QUERY_DELETE_2) - 4)
SET @QUERY_DELETE_1 = @QUERY_DELETE_1 + @NOME_TABELA
SET @QUERY_DELETE = @QUERY_DELETE_1 + @QUERY_DELETE_2
EXEC(@QUERY_DELETE)
--PRINT @QUERY_DELETE
END
ELSE IF (@TIPO_EXEC = 4) --UPDATE
BEGIN
DECLARE @QUERY_UPDATE VARCHAR(MAX)
DECLARE @QUERY_UPDATE_1 VARCHAR(MAX)
DECLARE @QUERY_UPDATE_2 VARCHAR(MAX)
DECLARE @QUERY_UPDATE_3 VARCHAR(MAX)
SET @QUERY_UPDATE_1 = 'UPDATE '
SET @QUERY_UPDATE_2 = ' SET '
SET @QUERY_UPDATE_3 = ' WHERE '
SET @TEM_FILTRO = 0
DECLARE XML_CURSOR CURSOR FAST_FORWARD FOR
SELECT NOME_TABELA = T.Item.value('../../@NOME', 'varchar(MAX)'),
NOME_COLUNA = T.Item.value('../@NOME' , 'varchar(MAX)'),
VALOR_COLUNA = T.Item.value('../@VALOR' , 'varchar(MAX)'),
COLUNA_EDITAVEL = T.Item.value('../@EDITAVEL' , 'varchar(MAX)'),
COLUNA_CHAVE = T.Item.value('../@CHAVE_PRIMARIA' , 'varchar(MAX)'),
TIPO_COLUNA = T.Item.value('@TIPO' , 'varchar(MAX)')
FROM @XML_INPUT.nodes('//TABELA/COLUNA/TIPO') AS T(Item);
OPEN XML_CURSOR;
FETCH NEXT FROM XML_CURSOR
INTO
@NOME_TABELA, @NOME_COLUNA, @VALOR_COLUNA, @COLUNA_EDITAVEL, @COLUNA_CHAVE, @TIPO_COLUNA;
WHILE @@FETCH_STATUS = 0
BEGIN
IF(@TIPO_COLUNA <> 'timestamp')
BEGIN
IF (LTRIM(RTRIM(@VALOR_COLUNA)) = '')
BEGIN
SET @VALOR_NUMERICO = 'NULL'
END
ELSE
BEGIN
SET @VALOR_NUMERICO = @VALOR_COLUNA
END
IF(@COLUNA_EDITAVEL = 'S' AND @COLUNA_CHAVE = 'N')
BEGIN
IF((@TIPO_COLUNA = 'int' OR @TIPO_COLUNA = 'decimal'))
BEGIN
SET @QUERY_UPDATE_2 = @QUERY_UPDATE_2 + @NOME_COLUNA + ' = ' + @VALOR_NUMERICO + ', '
END
ELSE
BEGIN
SET @QUERY_UPDATE_2 = @QUERY_UPDATE_2 + @NOME_COLUNA + ' = ' + '''' + @VALOR_COLUNA + '''' + ', '
END
END
ELSE
BEGIN
IF((@TIPO_COLUNA = 'int' OR @TIPO_COLUNA = 'decimal'))
BEGIN
SET @QUERY_UPDATE_3 = @QUERY_UPDATE_3 + @NOME_COLUNA + ' = ' + @VALOR_COLUNA + ' AND '
END
ELSE
BEGIN
SET @QUERY_UPDATE_3 = @QUERY_UPDATE_3 + @NOME_COLUNA + ' = ' + '''' + @VALOR_COLUNA + '''' + ' AND '
END
Set @TEM_FILTRO = 1
END
END
FETCH NEXT FROM XML_CURSOR
INTO
@NOME_TABELA, @NOME_COLUNA, @VALOR_COLUNA, @COLUNA_EDITAVEL, @COLUNA_CHAVE, @TIPO_COLUNA;
END;
CLOSE XML_CURSOR;
DEALLOCATE XML_CURSOR;
SELECT @QUERY_UPDATE_2 = LEFT(@QUERY_UPDATE_2, LEN(@QUERY_UPDATE_2) - 1)
SELECT @QUERY_UPDATE_3 = LEFT(@QUERY_UPDATE_3, LEN(@QUERY_UPDATE_3) - 4)
SET @QUERY_UPDATE_1 = @QUERY_UPDATE_1 + @NOME_TABELA
SET @QUERY_UPDATE = @QUERY_UPDATE_1 + @QUERY_UPDATE_2
IF (@TEM_FILTRO = 1)
BEGIN
SET @QUERY_UPDATE = @QUERY_UPDATE + @QUERY_UPDATE_3
END
EXEC(@QUERY_UPDATE)
--PRINT @QUERY_UPDATE
End
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment