<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1954476673957285943</id><updated>2026-10-26T00:31:43.469-03:00</updated><category term="SQL Server"/><category term="Postgres"/><category term="Oracle"/><category term="SQL"/><category term="Algoritmos"/><category term="Outros"/><category term="MySql"/><category term="DB2"/><category term="IBM DB2"/><title type='text'>O Peregrino</title><subtitle type='html'>DBA, MySql, Oracle, Postgres, SQL Server, DB2, BI, TI, Business Intelligence, Data Science, Machine Learning, IoT, Arduino</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>55</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-4488836259291048102</id><published>2017-08-17T16:00:00.002-03:00</published><updated>2021-01-05T11:34:15.350-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DB2"/><category scheme="http://www.blogger.com/atom/ns#" term="IBM DB2"/><title type='text'>Erro: SQL0290N Table space access is not allowed. SQLSTATE=55039</title><content type='html'>Erro: SQL0290N Table space access is not allowed. SQLSTATE=55039
&lt;/BR&gt;
&lt;/BR&gt;
Problema: 
O problema ocorre quando se vai persistir algo (tabela, etc) em alguma tablespace.
&lt;/BR&gt;
&lt;/BR&gt;
Comentário: 
O IBM DB2 é bastante seguro quanto a este requisito, pois em se tratando de novas tablespace criadas ou alteras, o IBM DB2 por segurança bloquea qualquer persistencia enquanto não for efetuado backup.
&lt;/BR&gt;
&lt;/BR&gt;
Requisitos: &lt;/BR&gt;
SO: Windows &lt;/BR&gt;
SGBDR: IBM DB2: v 9.5 &lt;/BR&gt;
&lt;/BR&gt;
&lt;/BR&gt;
Verificando o Problema:
&lt;/BR&gt;
&lt;/BR&gt;
&lt;!-- &lt;pre class=&quot;brush:bash&quot;&gt; --&gt;
&lt;pre class=&quot;prettyprint linenums&quot;&gt;
cmd 
g:
cd\
mkdir backup
db2cmd 
db2 
db2 =&gt; connect to MEU_BANCO_DADOS user MEU_USUARIO_DB2_ADM
db2 =&gt; list tablespaces

Tablespace ID = 2
Name = USERSPACE1
Type = Database managed space
Contents = All permanent data. Large table space.
State = 0x0020
Detailed explanation:
Backup pending
&lt;/pre&gt;
&lt;/BR&gt;
&lt;/BR&gt;
Solução:
&lt;/BR&gt;&lt;/BR&gt;
&lt;!-- &lt;pre class=&quot;brush:bash&quot;&gt; --&gt;
&lt;pre class=&quot;prettyprint linenums&quot;&gt;
db2 =&gt; backup db MEU_BANCO_DADOS online to g:\backup
&lt;/pre&gt;
&lt;/BR&gt;&lt;/BR&gt;
Verificando a Solução:
&lt;/BR&gt;&lt;/BR&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;
db2 =&gt; list tablespaces

Tablespace ID = 2
Name = USERSPACE1
Type = Database managed space
Contents = All permanent data. Large table space.
State = 0x0000
Detailed explanation:
Normal 

&lt;/pre&gt;
&lt;/BR&gt;
&lt;/BR&gt;
Mais uma vez espero ter ajudado! 
&lt;/BR&gt;
APSJC!
&lt;/BR&gt;</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/4488836259291048102/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2017/08/erro-sql0290n-table-space-access-is-not.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/4488836259291048102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/4488836259291048102'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2017/08/erro-sql0290n-table-space-access-is-not.html' title='Erro: SQL0290N Table space access is not allowed. SQLSTATE=55039'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-6227307044952101484</id><published>2015-04-23T16:57:00.001-03:00</published><updated>2023-04-08T17:55:54.889-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Outros"/><title type='text'>Bíblia Português João Ferreira de Almeida - Edição Revista e Corrigida em formato Linux Fortune</title><content type='html'>Para quem gosta de usar o Linux Fortune 

Segue a Bíblia em Português João Ferreira de Almeida - Edição Revista e Corrigida em formato Linux Fortune, conforme link abaixo: 
&lt;a href=&quot;http://201.76.149.52/peregrino/Biblia_fortunes.zip&quot;&gt;BÍBLIA_JFARC_FORTUNES&lt;/a&gt;

</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/6227307044952101484/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2015/04/biblia-portugues-joao-ferreira-de.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/6227307044952101484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/6227307044952101484'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2015/04/biblia-portugues-joao-ferreira-de.html' title='Bíblia Português João Ferreira de Almeida - Edição Revista e Corrigida em formato Linux Fortune'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-8827509700733809334</id><published>2015-04-02T14:36:00.000-03:00</published><updated>2015-04-06T11:57:03.184-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmos"/><category scheme="http://www.blogger.com/atom/ns#" term="Oracle"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><title type='text'>Ultimo Dia Util Considerando Feriados em Oracle PL/SQL</title><content type='html'>/* Geralmente é complicado obter o ultimo dia válido considerando os feriados nacionais, &lt;/br&gt;
muito usado no ramo financeiro. */ &lt;/br&gt;&lt;/br&gt; 

/* Esse artigo pretende dá uma opção de como obter o ultimo dia util dentre várias soluções &lt;/br&gt;
encontradas na net, com o uso de stores functions do Oracle PL/SQL */&lt;/br&gt;&lt;/br&gt;

/* Mostrando como criar uma função SQL Oracle isto é em PL/SQL para obter o ultimo dia útil, considerando os feriados nacionais dentre outros assuntos correlacionados.  */ &lt;/br&gt;&lt;/br&gt;

/* Primeiro criamos uma tabela feriado para melhor elucidar as store functions, conforme script abaixo: */
&lt;/br&gt;&lt;/br&gt; 

&lt;pre class=&quot;brush:sql&quot;&gt;

-- DROP TABLE FERIADO;
CREATE TABLE FERIADO
(
   ID_FERIADO                       NUMBER(10,0)       NOT NULL ENABLE
 , DATA                             DATE               NOT NULL ENABLE
 , DESCRICAO                        VARCHAR2(50 BYTE)  NOT NULL ENABLE
 , ID_TIPO_FERIADO                  NUMBER(3,0)        NOT NULL ENABLE -- 1 NACIONAL, 2 ESTADUAL, 3 MUNICIPAL, 4 OUTROS
 , OBS                              NVARCHAR2(15)
 , CONSTRAINT PK_FERIADO_ID_FERIADO PRIMARY KEY (ID_FERIADO)
 , CONSTRAINT UQ_FERIADO_DATA UNIQUE (DATA)
);

-- DROP SEQUENCE FERIADO_FCSEQ; 
CREATE SEQUENCE FERIADO_FCSEQ
INCREMENT BY 1
START WITH 1
NOCYCLE;

-- DROP TRIGGER TG_FERIADO_ID_FERIADO_BI;
CREATE OR REPLACE TRIGGER TG_FERIADO_ID_FERIADO_BI BEFORE INSERT ON FERIADO
FOR EACH ROW
 WHEN (new.ID_FERIADO IS NULL) BEGIN
  SELECT FERIADO_FCSEQ.NEXTVAL INTO :new.ID_FERIADO FROM dual;
END;
/
ALTER TRIGGER TG_FERIADO_ID_FERIADO_BI ENABLE;
&lt;/pre&gt;
&lt;/br&gt;&lt;/br&gt; 
/* Se desejar usar o o arquivo CSV dos feriados chamado &lt;a href=&quot;http://www.4shared.com/file/6D6oTzyjce/FERIADO.html&quot;&gt;FERIADOS.CSV&lt;/a&gt; com CRLF no final de cada linha, use o SQL Loader do Oracle para dá carga do arquivo, evitando assim digitação de datas, é possível obtê-lo &lt;a href=&quot;http://www.4shared.com/file/6D6oTzyjce/FERIADO.html&quot;&gt;CLICANDO AQUI!&lt;/a&gt; */ &lt;/br&gt;
/* Criando o arquivo de controle chamado  &lt;a href=&quot;http://www.4shared.com/file/M_KCt07Yba/FERIADO.html&quot;&gt;FERIADO.CTL&lt;/a&gt;  salvo no diretorio C:\TEMP */ &lt;/br&gt;

&lt;pre class=&quot;brush:bash&quot;&gt;
load data
  infile &#39;FERIADO.CSV&#39;
  into table feriado
  fields terminated by &quot;|&quot;
  (
      data  DATE &quot;YYYY-MM-DD&quot;
    , descricao
    , id_tipo_feriado
    , obs
  )
&lt;/pre&gt;
/* Depois executar o SQL Loader, no Linux é igual ao do Windows considerando nome da pasta, no Windows fica assim: */ &lt;/br&gt;
/* Lembrando de considerar, isto é, permutar seu usuario e senha, ip_servidor e SID do Oracle do seu servidor*/ &lt;/br&gt;

&lt;pre class=&quot;brush:bash&quot;&gt;
sqlldr usuario/senha@ip_servidor/SID control=FERIADO.CTL log=X.LOG bad-Z.BAD READSIZE=10000000
&lt;/pre&gt;
&lt;/br&gt;&lt;/br&gt; 
/* Depois criamos uma store function para idenficar dias feriados usando a tabela feriado conforme script abaixo: */
&lt;/br&gt;&lt;/br&gt; 

&lt;pre class=&quot;brush:sql&quot;&gt;

CREATE OR REPLACE FUNCTION usf_feriado (d in date) 
RETURN integer 
AS
  
  x integer; 

BEGIN 

  SELECT count(*) 
    INTO x
    FROM feriado 
   WHERE to_char(data,&#39;YYYY-MM-DD&#39;) = to_char(d,&#39;YYYY-MM-DD&#39;); 
   
  IF (x &gt;= 1) THEN 
      RETURN 1;
  ELSE 
      RETURN 0; 
  END IF;
  
END usf_feriado; 

&lt;/pre&gt;

&lt;/br&gt;&lt;/br&gt; 
/* Logo em seguida criamos um store function para tratar o ultimo dia util, conforme script abaixo: */
&lt;/br&gt;&lt;/br&gt; 

&lt;pre class=&quot;brush:sql&quot;&gt;

CREATE OR REPLACE FUNCTION usf_ultimo_dia_util ( dt_base in date ) 
RETURN date 
AS

  dt_basex date; 
  bo_fimx  boolean; 

BEGIN 

  dt_basex := dt_base; 
  bo_fimx  := false; 
  
  WHILE NOT (bo_fimx) LOOP 
  
      bo_fimx := to_char(dt_basex,&#39;d&#39;) NOT IN (&#39;1&#39;,&#39;7&#39;);
      
      IF usf_feriado(dt_basex) = 1 THEN 
          bo_fimx := false;
      END IF; 
      
      IF NOT (bo_fimx) THEN 
          dt_basex := dt_basex - 1; 
      END IF; 
      
  END LOOP; 
  
  RETURN dt_basex; 
  
EXCEPTION 

  WHEN others THEN 
  RAISE; 
  
  
END usf_ultimo_dia_util;
&lt;/pre&gt;

&lt;/br&gt;&lt;/br&gt; 
/* Testando o uso da function em SQL puro  */ 
&lt;/br&gt;&lt;/br&gt; 

&lt;pre class=&quot;brush:sql&quot;&gt;

SELECT usf_feriado(sysdate) AS DT FROM DUAL; -- RETORNA 1 PARA FERIADO E 0 PARA OUTROS DIAS 

ALTER SESSION SET NLS_DATE_FORMAT = &#39;YYYY-MM-DD&#39;; -- ALTERA DATA PARA FORMATO &#39;YYYY-MM-DD&#39;

SELECT usf_ultimo_dia_util (&#39;2015-04-05&#39;) from dual; -- RETORNA O ULTIMO DIA UTIL -&gt; 2015-04-02

&lt;/pre&gt;

/* Espero ter ajudado! */ &lt;/br&gt;&lt;/br&gt;

/* Seja Feliz!! */ &lt;/br&gt;&lt;/br&gt;

/* APdSJC */ &lt;/br&gt;&lt;/br&gt;</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/8827509700733809334/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2015/04/ultimo-dia-util-considerando-feriados.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/8827509700733809334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/8827509700733809334'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2015/04/ultimo-dia-util-considerando-feriados.html' title='Ultimo Dia Util Considerando Feriados em Oracle PL/SQL'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-7348559360124583561</id><published>2015-03-02T10:27:00.000-03:00</published><updated>2015-03-02T10:28:38.138-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Outros"/><category scheme="http://www.blogger.com/atom/ns#" term="Postgres"/><title type='text'>Vida de DBA</title><content type='html'>Isso é a pura realidade de quem não sabe trabalhar com Postgres :) &lt;/br&gt;
&lt;/br&gt;
Apenas compartilhando ... &lt;/br&gt;
&lt;/br&gt;
Resultado, sobra pro DBA resolver a bagunça. Vida de DBA é assim! &lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5zMP5VqS0jwRQQTBioU4FSfmaEfqfF98NVcqZJKIHteRGXUTrw9LAnZyGijtDOf_SA0xkHspjPLN5rMM23vquhWJd-qqRsFfAaVRivwslTf4PY24uVIYfO4DOLa96FCoL4YihK8Y9kug/s1600/tirinha1364_vida_de_dba.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5zMP5VqS0jwRQQTBioU4FSfmaEfqfF98NVcqZJKIHteRGXUTrw9LAnZyGijtDOf_SA0xkHspjPLN5rMM23vquhWJd-qqRsFfAaVRivwslTf4PY24uVIYfO4DOLa96FCoL4YihK8Y9kug/s400/tirinha1364_vida_de_dba.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
...
&lt;/br&gt;
Estraído do site &lt;a href=&quot;http://www.vidadeprogramador.com.br&quot;&gt;www.vidadeprogramador.com.br&lt;/a&gt;
&lt;/br&gt;
&lt;a href=&quot;http://vidadeprogramador.com.br/2015/02/28/drop-database/&quot;&gt;http://vidadeprogramador.com.br/2015/02/28/drop-database/&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/7348559360124583561/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2015/03/vida-de-dba.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/7348559360124583561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/7348559360124583561'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2015/03/vida-de-dba.html' title='Vida de DBA'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5zMP5VqS0jwRQQTBioU4FSfmaEfqfF98NVcqZJKIHteRGXUTrw9LAnZyGijtDOf_SA0xkHspjPLN5rMM23vquhWJd-qqRsFfAaVRivwslTf4PY24uVIYfO4DOLa96FCoL4YihK8Y9kug/s72-c/tirinha1364_vida_de_dba.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-5159941393021004196</id><published>2014-07-09T10:43:00.000-03:00</published><updated>2015-04-13T11:08:18.052-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Oracle"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Como Listar Estrutura de Campos e Tabelas via query em SQL Server </title><content type='html'>Geralmente quando queremos saber informações sobre colunas e tabelas, no SQL Server usamos a store procedure sp_help [nome_tabela], mas o objetivo dessa query é filtrar determinadas condições a exemplo de tamanho de identificadores superiores a 30 caracteres, o clássico erro ORA-00972: identifier is too long. do Oracle, para quem trabalha com sistemas Multi SGBDR ou migração de dados, essa query resolve essa e outras perguntas. 
&lt;/br&gt;
&lt;/br&gt;
Segue:
&lt;/br&gt;
&lt;/br&gt;

&lt;pre class=&quot;brush:sql&quot;&gt;
SELECT TABLE_CATALOG              AS BD
     , TABLE_SCHEMA               AS ESQUEMA_TABELA
     , TABLE_NAME                 AS TABELA 
     , COLUMN_NAME                AS COLUNA 
     , ORDINAL_POSITION           AS ORD_POS
     , DATA_TYPE                  AS TIPO 
     , CHARACTER_MAXIMUM_LENGTH   AS TAM_CARACTER
     , DATETIME_PRECISION         AS TAM_DATA
     , NUMERIC_PRECISION          AS TAM_NUMERICO
     , CASE WHEN CHARACTER_MAXIMUM_LENGTH  IS NOT NULL THEN
                CAST(CHARACTER_MAXIMUM_LENGTH AS NUMERIC(16,6))
            WHEN DATETIME_PRECISION IS NOT NULL THEN
                CAST(DATETIME_PRECISION AS NUMERIC(16,6))
            ELSE
                CAST(CAST(NUMERIC_PRECISION AS VARCHAR) + &#39;.&#39; + CAST( NUMERIC_SCALE AS VARCHAR) AS NUMERIC(16,6))
       END                        AS TAM
     , CASE WHEN IS_NULLABLE = &#39;YES&#39; THEN
           &#39;SIM&#39;
       ELSE
           &#39;NÃO&#39;
       END                        AS [NULO?]
     , COLLATION_NAME             AS COLLATION
     , LEN(COLUMN_NAME)           AS TAM_NOME_COLUNA 
     , LEN(TABLE_NAME)            AS TAM_NOME_TABELA 
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE 1=1 
   --Testa condição de identificadores maior que 30 caracteres usado na migração para Oracle ou sistemas multi SGBDR
   --O clássico erro ORA-00972: identifier is too long. do Oracle, para quem trabalha com sistemas Multi SGBDR ou migração dados.
   --AND LEN(COLUMN_NAME) &gt; 30 OR  LEN( TABLE_NAME) &gt; 30 
   --Testa por nome de tabela   
   --AND TABLE_NAME  = &#39;NOME_TABELA&#39;
   --Testa por coluna (campo) 
   --AND COLUMN_NAME = &#39;NOME_COLUNA&#39;

&lt;/pre&gt;

Mais uma vez, espero ter ajudado. 

Seja feliz e fique na Paz de Jesus Cristo. 


</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/5159941393021004196/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2014/07/como-listar-estrutura-de-campos-e.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/5159941393021004196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/5159941393021004196'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2014/07/como-listar-estrutura-de-campos-e.html' title='Como Listar Estrutura de Campos e Tabelas via query em SQL Server '/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-1387352114704414245</id><published>2013-12-26T10:42:00.001-03:00</published><updated>2014-01-06T11:27:45.366-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmos"/><category scheme="http://www.blogger.com/atom/ns#" term="Outros"/><title type='text'>Código, Algoritmo de um Plano de Contas escrito em VB</title><content type='html'>Complementando um artigo descrito em &lt;a href=&quot;http://emersonhermann.blogspot.com.br/2012/09/consulta-sql-de-plano-de-contas-query.html&quot;&gt;http://emersonhermann.blogspot.com.br/2012/09/consulta-sql-de-plano-de-contas-query.html&lt;/a&gt;
Consulta SQL de Plano de Contas - Query Contabil - Query para Centro de Custo, apenas exponho um simples código para elucidar como deveria ser feito, isto é, como seria implementado um algoritmo para totalizar um plano de contas em uma linguagem de programação, a exemplo aqui do VBA, em casos que não é possível usar uma query ou um SGBD sem um suporte mais abrangente ao SQL a exemplo do ACCESS 2010. 
&lt;/br&gt;
&lt;/br&gt;

&lt;pre class=&quot;brush:vb&quot;&gt;
&#39;Um código bem básico para uma estrutura de três níveis escrito em &#39;VB para o Access 2010 
Option Compare Database

Sub centro_custo()
&#39; funciona para uma estrutura de contas em 3 niveis
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim soma_n1, soma_n2, soma_n3 As Double
Dim tamanho_conta As Integer
Dim strSQL As String
&#39; lista todas as contas cadastradas em centro_custo
Set rs1 = CurrentDb.OpenRecordset(&quot;SELECT id_centro_custo, descricao, tipo_conta FROM centro_custo ORDER BY id_centro_custo DESC;&quot;)
Do While Not rs1.EOF
   &#39; contas nivel 3
   &#39; todas contas analiticas, nessa estrutura as contas tem o nivel 3
   If (rs1(&quot;tipo_conta&quot;) = &quot;A&quot;) Then
       &#39; processa o nivel 3 na query em strSQL
       strSQL = &quot;SELECT cc.id_centro_custo, cc.descricao, sum(m.valor_movimento) AS total_conta FROM centro_custo cc INNER JOIN movimento m  ON m.id_centro_custo LIKE cc.id_centro_custo WHERE cc.id_centro_custo =  &#39;&quot; &amp; rs1(&quot;id_centro_custo&quot;) &amp; &quot;&#39; GROUP BY cc.id_centro_custo, cc.descricao;&quot;
       Set rs2 = CurrentDb.OpenRecordset(strSQL)
       If Not rs2.EOF Then
           soma_n3 = rs2(&quot;total_conta&quot;)
       Else
           soma_n3 = 0
       End If
       soma_n2 = soma_n2 + soma_n3
       Debug.Print rs1(&quot;id_centro_custo&quot;) &amp; &quot; - &quot; &amp; rs1(&quot;descricao&quot;) &amp; &quot; - &quot; &amp; rs1(&quot;tipo_conta&quot;) &amp; &quot; - &quot; &amp; soma_n3
   Else

       tamanho_conta = Len(rs1(&quot;id_centro_custo&quot;))
       &#39; contas nivel 2
       If tamanho_conta = 3 Then
           Debug.Print rs1(&quot;id_centro_custo&quot;) &amp; &quot; - &quot; &amp; rs1(&quot;descricao&quot;) &amp; &quot; - &quot; &amp; rs1(&quot;tipo_conta&quot;) &amp; &quot; - &quot; &amp; soma_n2
           soma_n1 = soma_n1 + soma_n2
           soma_n2 = 0
       Else
           &#39; contas nivel 1
           If tamanho_conta = 1 Then
               Debug.Print rs1(&quot;id_centro_custo&quot;) &amp; &quot; - &quot; &amp; rs1(&quot;descricao&quot;) &amp; &quot; - &quot; &amp; rs1(&quot;tipo_conta&quot;) &amp; &quot; - &quot; &amp; soma_n1
               soma_n1 = 0
           End If
       End If
   End If
   &#39; avanca proximo registro
   rs1.MoveNext
Loop

End Sub

&#39; Informo ainda que os níveis podem ser configurados via matrizes 
&#39; e código desenvolvido acima é procedural
&#39; Recomendo definir uma mascara do plano de contas
&lt;/pre&gt;
&lt;/br&gt;
Resultado do Código em VBA Acima Descrito 
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaYGSUhhQkDiJERfGiUSNaOJbb-9aItX_4Yr0gZ9ND1dhyphenhyphens7oewIpmdJjdhGIEGxfWCZmsnAnX6AA8zQfoH6hZRw1kj5S1r_uNdSPHO4r1Gh_U8KVrsHLNPUKGHYOY19EYnExIqeZZmQw/s1600/resultado_plano_contas_code_vb.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaYGSUhhQkDiJERfGiUSNaOJbb-9aItX_4Yr0gZ9ND1dhyphenhyphens7oewIpmdJjdhGIEGxfWCZmsnAnX6AA8zQfoH6hZRw1kj5S1r_uNdSPHO4r1Gh_U8KVrsHLNPUKGHYOY19EYnExIqeZZmQw/s400/resultado_plano_contas_code_vb.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/br&gt;
&lt;/br&gt;
Mais uma vez espero ter ajudado!
&lt;/br&gt;
APdSJC!
&lt;/br&gt;</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/1387352114704414245/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2013/12/codigoplanocontasvb.html#comment-form' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/1387352114704414245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/1387352114704414245'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2013/12/codigoplanocontasvb.html' title='Código, Algoritmo de um Plano de Contas escrito em VB'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaYGSUhhQkDiJERfGiUSNaOJbb-9aItX_4Yr0gZ9ND1dhyphenhyphens7oewIpmdJjdhGIEGxfWCZmsnAnX6AA8zQfoH6hZRw1kj5S1r_uNdSPHO4r1Gh_U8KVrsHLNPUKGHYOY19EYnExIqeZZmQw/s72-c/resultado_plano_contas_code_vb.png" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-4258689638029048777</id><published>2013-11-29T17:53:00.003-03:00</published><updated>2013-12-16T09:51:47.736-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MySql"/><category scheme="http://www.blogger.com/atom/ns#" term="Oracle"/><category scheme="http://www.blogger.com/atom/ns#" term="Outros"/><category scheme="http://www.blogger.com/atom/ns#" term="Postgres"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Desenvolvendo Querys Compativeis com Todos os SGBDRs com Ajuda do SQL Fiddle</title><content type='html'>Desenvolvendo Querys Compativeis com Todos os SGBDRs com Ajuda do SQL Fiddle&lt;/br&gt;
&lt;/br&gt;
&lt;/br&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglwioBK6wqSCrdNcyqmMPu6ip-FIWIoQAM9gamgLBO43ttnyix4MQYCafQWc_yuKTB_PUQg-BgSltPQWG6Gs4xQRsBtL9RR6z6J_X1T2_9o3oAxgZxK4eswuFdFHtle_EKJFNT7ew_YcM/s1600/sql_fiddle.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglwioBK6wqSCrdNcyqmMPu6ip-FIWIoQAM9gamgLBO43ttnyix4MQYCafQWc_yuKTB_PUQg-BgSltPQWG6Gs4xQRsBtL9RR6z6J_X1T2_9o3oAxgZxK4eswuFdFHtle_EKJFNT7ew_YcM/s640/sql_fiddle.png&quot; /&gt;&lt;/a&gt;
Sabe quando um amigo lhe pede uma ajuda sobre como desenvolver uma determinada query e você não sabe como explicar, essa é a dica para quem já passou por esse tipo de problema chama-se &lt;a href=&quot;http://sqlfiddle.com/&quot;&gt;SQL Fiddle&lt;/a&gt;  &lt;/br&gt;
Muitas vezes não é possível testar uma determinada query por não ter o SGBDR instalado ou está sem uma conexão segura ao SGBDR, então a dica é usar o &lt;a href=&quot;http://sqlfiddle.com/&quot;&gt;SQL Fiddle&lt;/a&gt;. &lt;/br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_NZbGuzYiabnOR1qZCxck5CFaGsNy-cy027aiEG3ugwmzBSi81u7M-j6o5PSbXT8WMZpT9EBecqMIOXoDej8RU3EPTjlxRy41iSpQBLiylA0MHXxdxcTokxSgqg6Vq4-G1NbQziE0JBU/s1600/sql_fiddle3.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_NZbGuzYiabnOR1qZCxck5CFaGsNy-cy027aiEG3ugwmzBSi81u7M-j6o5PSbXT8WMZpT9EBecqMIOXoDej8RU3EPTjlxRy41iSpQBLiylA0MHXxdxcTokxSgqg6Vq4-G1NbQziE0JBU/s640/sql_fiddle3.png&quot; /&gt;&lt;/a&gt;
Nesse site &lt;a href=&quot;http://sqlfiddle.com/&quot;&gt;http://sqlfiddle.com/&lt;/a&gt; ainda existe a possibilidade de verificar como funciona a mesma query nos diversos SGBDRs e suas diversas versões, uma feature interessante para quem desenvolve sistemas multi-SGBDRs. &lt;/br&gt;

&lt;/br&gt;
Segue a dica para trabalhar com SQL Fiddle. &lt;/br&gt;
&lt;/br&gt;
Acessar o SQL Fiddle no seguinte site: &lt;a href=&quot;http://sqlfiddle.com/&quot;&gt;http://sqlfiddle.com/&lt;/a&gt;
Na primeira coluna coloca-se os comandos DDL (de criação de estrutura, tabelas, views, etc). &lt;/br&gt; 
Executar com o botão Run Schema. &lt;/br&gt;
Na segunda coluna coloca-se os comandos DML (insert, update, delete, selects). &lt;/br&gt;
Executar com o botão Run SQL. &lt;/br&gt;
Outra observação é que o &lt;a href=&quot;http://sqlfiddle.com/&quot;&gt;SQL Fiddle&lt;/a&gt; não armazena o cache dos scripts, então há de se rodar toda a query de uma única vez. &lt;/br&gt;
&lt;/br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5VdV3Q656pt_VMrO0OfkiBzWkBGGXd80jKbaBy9kJZ7BN0ofTH3aA6ee5GoRuaS6EgEvD3LtVYQKzQPgOE0QWr7hw0E565xQ6vmj3sNSo4hXPWovXpYtRtscC3DSQelGnH_cmfA-cbZE/s1600/sql_fiddle2.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5VdV3Q656pt_VMrO0OfkiBzWkBGGXd80jKbaBy9kJZ7BN0ofTH3aA6ee5GoRuaS6EgEvD3LtVYQKzQPgOE0QWr7hw0E565xQ6vmj3sNSo4hXPWovXpYtRtscC3DSQelGnH_cmfA-cbZE/s640/sql_fiddle2.png&quot; /&gt;&lt;/a&gt;
Mais uma vez espero ter ajudado. 
&lt;/br&gt;
&lt;/br&gt;
APdSJC!&lt;/br&gt;</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/4258689638029048777/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2013/11/desenvolvendo-querys-compativeis-com.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/4258689638029048777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/4258689638029048777'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2013/11/desenvolvendo-querys-compativeis-com.html' title='Desenvolvendo Querys Compativeis com Todos os SGBDRs com Ajuda do SQL Fiddle'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglwioBK6wqSCrdNcyqmMPu6ip-FIWIoQAM9gamgLBO43ttnyix4MQYCafQWc_yuKTB_PUQg-BgSltPQWG6Gs4xQRsBtL9RR6z6J_X1T2_9o3oAxgZxK4eswuFdFHtle_EKJFNT7ew_YcM/s72-c/sql_fiddle.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-8728571371769128330</id><published>2013-08-01T01:00:00.000-03:00</published><updated>2013-08-02T10:06:39.189-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Converter várias linhas em uma única linha no SQL Server</title><content type='html'>Como converter várias linhas em uma única linha no SQL Server, separando por ponto e virgula &quot;;&quot;. 
&lt;/br&gt;
&lt;/br&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;

USE tempdb;
-- DROP TABLE pessoa_fisica;
CREATE TABLE pessoa_fisica 
(
   id_pessoa_fisica int IDENTITY (1,1) PRIMARY KEY 
 , nome             varchar(100)       NOT NULL 
 , sexo             varchar(1)         NOT NULL 
); 

-- DROP TABLE email;
CREATE TABLE email 
(
   id_email         int IDENTITY (1,1) PRIMARY KEY 
 , email            varchar(100)       NOT NULL 
 , id_pessoa_fisica int                NOT NULL REFERENCES pessoa_fisica(id_pessoa_fisica) 
);  


-- inserindo na tabela pessoa_fisica
INSERT INTO pessoa_fisica (nome, sexo) VALUES (&#39;Maria&#39;,&#39;F&#39;); 
INSERT INTO pessoa_fisica (nome, sexo) VALUES (&#39;Ieda&#39;,&#39;F&#39;); 
INSERT INTO pessoa_fisica (nome, sexo) VALUES (&#39;Ilma&#39;,&#39;F&#39;); 
INSERT INTO pessoa_fisica (nome, sexo) VALUES (&#39;Felipe&#39;,&#39;F&#39;); 

-- listando todas as pessoas fisicas cadastradas 
SELECT * FROM pessoa_fisica;

-- inserindo na tabela email 

-- inserindo emails de Maria
INSERT INTO email (email, id_pessoa_fisica) VALUES (&#39;maria@exemplo.com&#39;, 1); 
INSERT INTO email (email, id_pessoa_fisica) VALUES (&#39;maria.rosa@exemplo.com&#39;, 1); 
INSERT INTO email (email, id_pessoa_fisica) VALUES (&#39;maria.silva@exemplo.com&#39;, 1); 

-- inserindo emails de Ieda
INSERT INTO email (email, id_pessoa_fisica) VALUES (&#39;ieda@exemplo.com&#39;, 2); 
INSERT INTO email (email, id_pessoa_fisica) VALUES (&#39;ieda.lima@exemplo.com&#39;, 2); 


-- inserindo emails de Felipe 
INSERT INTO email (email, id_pessoa_fisica) VALUES (&#39;felipe@exemplo.com&#39;, 4); 
INSERT INTO email (email, id_pessoa_fisica) VALUES (&#39;felipe.santos@exemplo.com&#39;, 4); 

-- listando todos os emails cadastrados
SELECT * FROM email;

-- listando emails de Maria 

-- listando emails de Maria em várias linhas 
-- exemplo 1.1

SELECT email + &#39;; &#39; FROM email WHERE id_pessoa_fisica = 1;

-- listando emails de Maria em uma única linha 
-- exemplo 1.2  

SELECT stuff( (SELECT email + &#39;; &#39; FROM email WHERE id_pessoa_fisica = 1  FOR XML PATH(&#39;&#39;)),1,0,&#39;&#39;);

-- listando todos os emails cadastrados com todas as pessoas cadastradas, 
--  considerando vários emails em uma unica linha.
-- exemplo 2

SELECT pessoa_fisica.nome
     , stuff ( 
               (
                 SELECT email.email + &#39;; &#39; 
                   FROM email 
                  WHERE email.id_pessoa_fisica = pessoa_fisica.id_pessoa_fisica  
                    FOR XML PATH(&#39;&#39;)
               ),1,0,&#39;&#39;
             ) AS emails
  FROM pessoa_fisica
     ;

&lt;/pre&gt;
&lt;/br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhVRc1vbm5dY7aH3AsBi12mSlcO8zBAnFbW1rqnojYB4koOqEBXKtf0m3yfvQukfvFlxRCZMbAeLfTPjDFGL_0pBOGiXURpTtFzqi_Ka3z4hj6FTxdkXzeAr66DTIC64Hwk9Vh15KxkPY/s1600/exemplo2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhVRc1vbm5dY7aH3AsBi12mSlcO8zBAnFbW1rqnojYB4koOqEBXKtf0m3yfvQukfvFlxRCZMbAeLfTPjDFGL_0pBOGiXURpTtFzqi_Ka3z4hj6FTxdkXzeAr66DTIC64Hwk9Vh15KxkPY/s400/exemplo2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/br&gt;
Mais uma vez espero ter ajudado ... 
&lt;/br&gt;</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/8728571371769128330/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2013/08/converter-varias-linhas-em-uma-unica.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/8728571371769128330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/8728571371769128330'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2013/08/converter-varias-linhas-em-uma-unica.html' title='Converter várias linhas em uma única linha no SQL Server'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhVRc1vbm5dY7aH3AsBi12mSlcO8zBAnFbW1rqnojYB4koOqEBXKtf0m3yfvQukfvFlxRCZMbAeLfTPjDFGL_0pBOGiXURpTtFzqi_Ka3z4hj6FTxdkXzeAr66DTIC64Hwk9Vh15KxkPY/s72-c/exemplo2.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-6101997744717352170</id><published>2013-07-24T01:56:00.000-03:00</published><updated>2013-07-29T13:13:17.773-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Postgres"/><title type='text'>Remover caracteres especiais em campos do Postgres</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXWWZd08ie-TYq28z4fVTETV8NT-GNag-T6_WLVat-tnrVYCgmf2B7iNQZ-QgIRWKX3pscj2z6-KjC9cXY9lst3KDtcvx1PnttNsOZSvQ_7wxm9mhPuNVpXQN_5xGXvrKxAZ1b4JpkXfw/s1600/pedra_inga_pequena.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXWWZd08ie-TYq28z4fVTETV8NT-GNag-T6_WLVat-tnrVYCgmf2B7iNQZ-QgIRWKX3pscj2z6-KjC9cXY9lst3KDtcvx1PnttNsOZSvQ_7wxm9mhPuNVpXQN_5xGXvrKxAZ1b4JpkXfw/s320/pedra_inga_pequena.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Function scalar para Postgres, com objetivo de remover caracteres especiais, exatamente 33 caracteres de controle (especiais) menos o NULL ficando 32 ao todo, recomendo usar essa store function em procedimentos de ETL, migração de dados ou em consultas que precisem remover esses tais caracteres da tabela ASCII. 
&lt;/br&gt;
&lt;/br&gt;
Fica aqui o compartilhamento do conhecimento.
&lt;/br&gt;
&lt;/br&gt;
Abraços.
&lt;/br&gt;
&lt;/br&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;
--
-- Nome Artefato/Programa..: usf_rm_special_chars.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann at gmail.com) 
-- ........................: O Peregrino / http://emersonhermann.blogspot.com
-- Data Inicio ............: 09/10/2008
-- Data Atual..............: 24/07/2012
-- Versao..................: 0.02
-- Compilador/Interpretador: PostgreSql
-- Sistemas Operacionais...: Linux/Windows
-- SGBD....................: PostgreSql 8.x/9.x
-- Kernel..................: Nao informado!
-- Finalidade..............: store function para remocao de caracteres especiais do ASCII (33) caracteres nao imprimiveis 
-- OBS.....................: 
--
--habilitando linguagem plpgsql 
--CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql HANDLER plpgsql_call_handler; 
-- languages 
--SELECT * FROM pg_language;
-- Apaga function se existir 
DROP FUNCTION IF EXISTS usf_rm_special_chars (TEXT);
CREATE OR REPLACE FUNCTION usf_rm_special_chars (stexto TEXT) RETURNS TEXT AS
$$
DECLARE
  stextonovo TEXT;
BEGIN
  -- Tabela ASCII
  -- Caracteres não imprimiveis, 33 ao total, menos o NUL ficam 32 
                                                    --  hex d abr ctl descricao  
                                                    --  00  0 NUL ^@ Null - Nulo desativado, pois o nulo no postgres funciona em forma de cascata 
  stextonovo := translate(stexto, chr(1),&#39;&#39;);       --  01  1 SOH ^A Start of Header - Início do cabeçalho
  stextonovo := translate(stextonovo, chr(2),&#39;&#39;);   --  02  2 STX ^B Start of Text - Início do texto
  stextonovo := translate(stextonovo, chr(3),&#39;&#39;);   --  03  3 ETX ^C End of Text - Fim do texto
  stextonovo := translate(stextonovo, chr(4),&#39;&#39;);   --  04  4 EOT ^D End of Tape - Fim de fita
  stextonovo := translate(stextonovo, chr(5),&#39;&#39;);   --  05  5 ENQ ^E Enquire - Interroga identidade do terminal
  stextonovo := translate(stextonovo, chr(6),&#39;&#39;);   --  06  6 ACK ^F Acknowledge - Reconhecimento
  stextonovo := translate(stextonovo, chr(7),&#39;&#39;);   --  07  7 BEL ^G Bell - Campainha
  stextonovo := translate(stextonovo, chr(8),&#39;&#39;);   --  08  8 BS  ^H  Back-space - Espaço atrás
  stextonovo := translate(stextonovo, chr(9),&#39;&#39;);   --  09  9 HT  ^I  Horizontal Tabulation - Tabulação horizontal
  stextonovo := translate(stextonovo, chr(10),&#39;&#39;);  --  0A 10 LF  ^J Line-Feed - Alimenta linha
  stextonovo := translate(stextonovo, chr(11),&#39;&#39;);  --  0B 11 VT  ^K  Vertical Tabulation - Tabulação vertical
  stextonovo := translate(stextonovo, chr(12),&#39;&#39;);  --  0C 12 FF  ^L Form-Feed - Alimenta formulário
  stextonovo := translate(stextonovo, chr(13),&#39;&#39;);  --  0D 13 CR  ^M Carriage-Return - Retorno do carro (enter)
  stextonovo := translate(stextonovo, chr(14),&#39;&#39;);  --  0E 14 SO  ^N Shift-Out - Saída do shift (passa a usar caracteres de baixo da tecla - minúsculas, etc.)
  stextonovo := translate(stextonovo, chr(15),&#39;&#39;);  --  0F 15 SI  ^O Shift-In-Ent. no shift (passa a usar carac. de cima da tecla: maiúsculas, carac. especiais, etc.)
  stextonovo := translate(stextonovo, chr(16),&#39;&#39;);  --  10 16 DLE ^P Data-Link Escape
  stextonovo := translate(stextonovo, chr(17),&#39;&#39;);  --  11 17 DC1 ^Q Device-Control 1
  stextonovo := translate(stextonovo, chr(18),&#39;&#39;);  --  12 18 DC2 ^R Device-Control 2
  stextonovo := translate(stextonovo, chr(19),&#39;&#39;);  --  13 19 DC3 ^S Device-Control 3
  stextonovo := translate(stextonovo, chr(20),&#39;&#39;);  --  14 20 DC4 ^T Device-Control 4
  stextonovo := translate(stextonovo, chr(21),&#39;&#39;);  --  15 21 NAK ^U Neg-Acknowledge - Não-reconhecimento
  stextonovo := translate(stextonovo, chr(22),&#39;&#39;);  --  16 22 SYN ^V Synchronous Idle
  stextonovo := translate(stextonovo, chr(23),&#39;&#39;);  --  17 23 vETB^W  End-of-Transmission Block
  stextonovo := translate(stextonovo, chr(24),&#39;&#39;);  --  18 24 CAN ^X Cancel
  stextonovo := translate(stextonovo, chr(25),&#39;&#39;);  --  19 25 EM  ^Y  End-Of-Medium
  stextonovo := translate(stextonovo, chr(26),&#39;&#39;);  --  1A 26 SUB ^Z Substitute
  stextonovo := translate(stextonovo, chr(27),&#39;&#39;);  --  1B 27 ESC ^[ Escape
  stextonovo := translate(stextonovo, chr(28),&#39;&#39;);  --  1C 28 FS  ^\  File Separator
  stextonovo := translate(stextonovo, chr(29),&#39;&#39;);  --  1D 29 GS  ^] Group Separator
  stextonovo := translate(stextonovo, chr(30),&#39;&#39;);  --  1E 30 RS  ^^  Record Separator
  stextonovo := translate(stextonovo, chr(31),&#39;&#39;);  --  1F 31 US  ^_ Unit Separator
  stextonovo := translate(stextonovo, chr(127),&#39;&#39;); --  7F127 DEL ^?  Delete

  RETURN stextonovo;
END;
$$
LANGUAGE &#39;plpgsql&#39; STABLE CALLED ON NULL INPUT SECURITY INVOKER;

&lt;/pre&gt;

&lt;/br&gt;
Test 1 &lt;/br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwoZZz_y9-E6JXbOT5ycPQyJQ9r61TvIvJHnVLsSAZVnzly61UAnCmaYh0F8N3Ju0wgvcX46AAVZOdPG38_Woqym3nfkxiV_7FjsrM3X3ifd8hCrFOiwmnzZzqqvh5cmjFPSyztttUkd4/s1600/test1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwoZZz_y9-E6JXbOT5ycPQyJQ9r61TvIvJHnVLsSAZVnzly61UAnCmaYh0F8N3Ju0wgvcX46AAVZOdPG38_Woqym3nfkxiV_7FjsrM3X3ifd8hCrFOiwmnzZzqqvh5cmjFPSyztttUkd4/s640/test1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;/br&gt;
Test 2 &lt;/br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCoDHmVwHszw5jtnEUfzoDPEUqNEJbcle7IrTWxh3wiSsvdIbQo1RFB4cRzm8MwM4S0De4Z6iudBhsqtFHUZu9GyTdChdPC_q7n0IZGU4ywVZvNZlu1e7amJ79bdmyUJGbTRoC6Qi28tA/s1600/test2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCoDHmVwHszw5jtnEUfzoDPEUqNEJbcle7IrTWxh3wiSsvdIbQo1RFB4cRzm8MwM4S0De4Z6iudBhsqtFHUZu9GyTdChdPC_q7n0IZGU4ywVZvNZlu1e7amJ79bdmyUJGbTRoC6Qi28tA/s640/test2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;/br&gt;
&lt;/br&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;

-- string com caracteres especiais, formato 2 
SELECT &#39;SEM STRESS... &#39; || chr(1) || &#39;TECLA  ENTER: &#39; || chr(13) || &#39; TECLA ESC: &#39; || chr(27) || &#39; TESTE OK &#39; AS test3; 
-- string sem caracteres espciais usando a function, formato 2 
SELECT usf_rm_special_chars(&#39;SEM STRESS... &#39; || chr(1) || &#39;TECLA  ENTER : &#39; || chr(13) || &#39;TECLA ESC: &#39; || chr(27) || &#39; TESTE OK &#39;) AS test4; 

-- verificando tamanho da string, 53 caracteres, incluindo 3 especiais 
SELECT length(&#39;SEM STRESS... &#39; || chr(1) || &#39;TECLA  ENTER : &#39; || chr(13) || &#39;TECLA ESC: &#39; || chr(27) || &#39; TESTE OK &#39;) AS test5; 
-- verificando tamanho da string, 50 caracteres, removido 3 especiais
SELECT length(usf_rm_special_chars(&#39;SEM STRESS... &#39; || chr(1) || &#39;TECLA  ENTER : &#39; || chr(13) || &#39;TECLA ESC: &#39; || chr(27) || &#39; TESTE OK &#39;)) AS test6; 


&lt;/pre&gt;

 </content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/6101997744717352170/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2013/07/remover-caracteres-especiais-em-campos.html#comment-form' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/6101997744717352170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/6101997744717352170'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2013/07/remover-caracteres-especiais-em-campos.html' title='Remover caracteres especiais em campos do Postgres'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXWWZd08ie-TYq28z4fVTETV8NT-GNag-T6_WLVat-tnrVYCgmf2B7iNQZ-QgIRWKX3pscj2z6-KjC9cXY9lst3KDtcvx1PnttNsOZSvQ_7wxm9mhPuNVpXQN_5xGXvrKxAZ1b4JpkXfw/s72-c/pedra_inga_pequena.jpg" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-759822284891096364</id><published>2013-01-29T13:16:00.006-03:00</published><updated>2020-12-26T22:36:35.050-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmos"/><category scheme="http://www.blogger.com/atom/ns#" term="Oracle"/><category scheme="http://www.blogger.com/atom/ns#" term="Postgres"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Desenvolvendo querys SQL para Razão e Balancete Contábil. </title><content type='html'>Desenvolvendo querys SQL para Razão e Balancete Contábil.
&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMk2BQoMvwmDs5kQlQur1S-8OM9HeRc9iUpEnOcPNZ7esrWXcSRkj2IYZb6wvCxKYPpKIeTEmiBePQO-4cUQTSm4X5qrd43Phj8P-JqLQisC88xql0yoaoFtVT7UmUMFcCO_DaA4h4axU/s1600/moedas_ouro.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear:right; float:right; margin-left:1em; margin-bottom:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;150&quot; width=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMk2BQoMvwmDs5kQlQur1S-8OM9HeRc9iUpEnOcPNZ7esrWXcSRkj2IYZb6wvCxKYPpKIeTEmiBePQO-4cUQTSm4X5qrd43Phj8P-JqLQisC88xql0yoaoFtVT7UmUMFcCO_DaA4h4axU/s200/moedas_ouro.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;


Em um artigo escrito neste blog no dia 06-09-2012 Consulta SQL de Plano de Contas - Query Contabil - Query para Centro de Custo conforme link &lt;a href=&quot;http://www.emersonhermann.blogspot.com.br/2012/09/consulta-sql-de-plano-de-contas-query.html&quot;&gt;http://www.emersonhermann.blogspot.com.br/2012/09/consulta-sql-de-plano-de-contas-query.html&lt;/a&gt;, mostrei como desenvolver uma query em uma estrutura de plano de contas ou centro de custo, dessa vez irei apresentar de forma prática, gradual e por exemplos de como desenvolver uma query para relatório de Razão, Razão Sumarizado e Balancete Contábil. 
&lt;/br&gt;
&lt;/br&gt;
Nivel de Complexidade: Intermediário, Avançado 
&lt;/br&gt;
&lt;/br&gt;
Quem desenvolve sabe como é complicado criar relatórios para contabilidade ou centro de custos, seja codificando em alguma linguagem ou mesmo tentando encurtar o tempo ou a pressão, usando algum gerador de relatórios, a exemplo do MS Report Service, SAP Crystal Reports, Script Case, etc. 
&lt;/br&gt;
&lt;/br&gt;
As querys scripts mostradas nesse artigo foram desenvolvidas para os seguintes SGBDRs em ordem alfabética: 
&lt;/br&gt;
&lt;/br&gt;
 Firebird 2.5.1
&lt;/br&gt; 
 Oracle 11g R2
&lt;/br&gt; 
 Postgres 9.1
&lt;/br&gt; 
 SQL Server 2012
&lt;/br&gt;
&lt;/br&gt;
A modelagem aqui apresentada não seguiu o rigor acadêmico, a exemplo de implementação de constraints, chaves primárias, etc, bem como os exemplos citados para area Contabil. 
&lt;/br&gt;
&lt;/br&gt;
O objetivo principal deste artigo é mostrar como desenvolver querys para Sistemas Contabeis, houve uma simplificação com intuíto de facilitar o entendimento, entretanto, com os exemplos expostos é possivel adotar em qualquer modelo relacional.
&lt;/br&gt;
&lt;/br&gt;
Houve também uma preocupação em apresentar os scripts desenvolvidos nos SGBDRs citados no inicio deste documento. 
&lt;/br&gt;
&lt;/br&gt;
Pode-se chegar aos mesmos resultados de uma forma mais performática e simples; estou apto a sugestões. 
&lt;/br&gt;
&lt;/br&gt;
Seguem os exemplos em scripts SQL: 
&lt;/br&gt;
&lt;/br&gt;
Criando as tabelas ... (Script para Firebird 2.5.1, Oracle 11g R2, Postgres 9.1, SQL Server 2012) 
&lt;/br&gt;
&lt;/br&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;
-- USE tempdb; -- Descomentar caso use SQL Server, recomendo criar um banco de teste para os outros SGBDRs.
--DROP TABLE plano_conta;
CREATE TABLE plano_conta
( 
   id_plano_conta   varchar(12) PRIMARY KEY   -- dados da conta ex. 1.02.01 
 , descricao        varchar(50)               -- descricao da conta cadastrada ex. Vendas Externas
 , tipo_conta       varchar(1)                -- tipo de conta do cc Analitica ou Sintética, dominio discreto: A ou S, em situação de produção merece uma constraint check
); 
 
--DROP TABLE lancamento;
CREATE TABLE lancamento 
(
   id_lancamento    integer   PRIMARY KEY    -- id do lancamento, recomenda-se auto incremento, mas para simplifcar fica sem auto incremento
 , dt_lancamento    date                     -- data do lancamento 
 , numero_doc       varchar(40)              -- numero do documento a ser informado  
 , id_plano_conta   varchar(12)              -- chave estrangeira para a tabela plano_conta, mas para simplificar apenas iremos convencionar, não será habilitado a FK, recomendo colocar not null
 , tipo_lancamento  varchar(1)               -- tipo de lancamento &#39;E&#39; = Entrada &#39;S&#39; = Saida 
 , historico        varchar(100)             -- historico do lancamento 
 , valor_lancamento numeric(15,2)            -- valor informado 
);
&lt;/pre&gt;
&lt;/br&gt;
Povoando os tabelas...
&lt;/br&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;
-- Receitas 
 
INSERT INTO plano_conta (id_plano_conta, descricao, tipo_conta) VALUES (&#39;1&#39;,&#39;Receita&#39;,&#39;S&#39;);
INSERT INTO plano_conta (id_plano_conta, descricao, tipo_conta) VALUES (&#39;1.1&#39;,&#39;Vendas Internas&#39;,&#39;S&#39;);
INSERT INTO plano_conta (id_plano_conta, descricao, tipo_conta) VALUES (&#39;1.1.1&#39;,&#39;Escola&#39;,&#39;A&#39;);
INSERT INTO plano_conta (id_plano_conta, descricao, tipo_conta) VALUES (&#39;1.1.2&#39;,&#39;Escritório&#39;,&#39;A&#39;);
INSERT INTO plano_conta (id_plano_conta, descricao, tipo_conta) VALUES (&#39;1.2&#39;,&#39;Vendas Externas&#39;,&#39;S&#39;);
INSERT INTO plano_conta (id_plano_conta, descricao, tipo_conta) VALUES (&#39;1.2.1&#39;,&#39;Livro&#39;,&#39;A&#39;);
INSERT INTO plano_conta (id_plano_conta, descricao, tipo_conta) VALUES (&#39;1.2.2&#39;,&#39;Brinquedos&#39;,&#39;A&#39;);
 
-- Despesas
 
INSERT INTO plano_conta (id_plano_conta, descricao, tipo_conta) VALUES (&#39;2&#39;,&#39;Despesas&#39;,&#39;S&#39;);
INSERT INTO plano_conta (id_plano_conta, descricao, tipo_conta) VALUES (&#39;2.1&#39;,&#39;Fornecedores&#39;,&#39;S&#39;);
INSERT INTO plano_conta (id_plano_conta, descricao, tipo_conta) VALUES (&#39;2.1.1&#39;,&#39;Nacional&#39;,&#39;A&#39;);
INSERT INTO plano_conta (id_plano_conta, descricao, tipo_conta) VALUES (&#39;2.1.2&#39;,&#39;Importado&#39;,&#39;A&#39;);
INSERT INTO plano_conta (id_plano_conta, descricao, tipo_conta) VALUES (&#39;2.2&#39;,&#39;Escritório&#39;,&#39;S&#39;);
INSERT INTO plano_conta (id_plano_conta, descricao, tipo_conta) VALUES (&#39;2.2.1&#39;,&#39;Materiais de limpeza&#39;,&#39;A&#39;);
INSERT INTO plano_conta (id_plano_conta, descricao, tipo_conta) VALUES (&#39;2.2.2&#39;,&#39;Materiais de Escritório&#39;,&#39;A&#39;);
 
-- Vamos povoar a tabela lancamento: 
INSERT INTO lancamento (id_lancamento, dt_lancamento, numero_doc, id_plano_conta, tipo_lancamento, historico, valor_lancamento) VALUES (1,&#39;2012-07-03&#39;,&#39;0000084&#39;,&#39;1.2.2&#39;,&#39;E&#39;,NULL,10.55); 
INSERT INTO lancamento (id_lancamento, dt_lancamento, numero_doc, id_plano_conta, tipo_lancamento, historico, valor_lancamento) VALUES (2,&#39;2012-07-03&#39;,&#39;0000084&#39;,&#39;1.2.2&#39;,&#39;S&#39;,NULL,2.50); 
INSERT INTO lancamento (id_lancamento, dt_lancamento, numero_doc, id_plano_conta, tipo_lancamento, historico, valor_lancamento) VALUES (3,&#39;2012-07-01&#39;,&#39;0000021&#39;,&#39;1.1.2&#39;,&#39;E&#39;,NULL,50.00);
INSERT INTO lancamento (id_lancamento, dt_lancamento,numero_doc, id_plano_conta, tipo_lancamento, historico, valor_lancamento) VALUES (4,&#39;2012-07-01&#39;,&#39;0000042&#39;,&#39;1.2.2&#39;,&#39;E&#39;,NULL,100.00);
INSERT INTO lancamento (id_lancamento, dt_lancamento, numero_doc, id_plano_conta, tipo_lancamento, historico, valor_lancamento) VALUES (5,&#39;2012-07-04&#39;,&#39;0000084&#39;,&#39;1.2.2&#39;,&#39;E&#39;,NULL,160.00);
INSERT INTO lancamento (id_lancamento, dt_lancamento, numero_doc, id_plano_conta, tipo_lancamento, historico, valor_lancamento) VALUES (6,&#39;2012-07-04&#39;,&#39;0000084&#39;,&#39;1.2.2&#39;,&#39;S&#39;,NULL,80.00);
 
INSERT INTO lancamento (id_lancamento, dt_lancamento, numero_doc, id_plano_conta, tipo_lancamento, historico, valor_lancamento) VALUES (7,&#39;2012-07-04&#39;,&#39;0000142&#39;,&#39;2.2.1&#39;,&#39;S&#39;,NULL,40.00);
INSERT INTO lancamento (id_lancamento, dt_lancamento, numero_doc, id_plano_conta, tipo_lancamento, historico, valor_lancamento) VALUES (8,&#39;2012-07-07&#39;,&#39;0000210&#39;,&#39;2.2.2&#39;,&#39;S&#39;,NULL,80.00);
INSERT INTO lancamento (id_lancamento, dt_lancamento, numero_doc, id_plano_conta, tipo_lancamento, historico, valor_lancamento) VALUES (9,&#39;2012-07-13&#39;,&#39;0000242&#39;,&#39;2.2.2&#39;,&#39;S&#39;,NULL,20.00);
INSERT INTO lancamento (id_lancamento, dt_lancamento, numero_doc, id_plano_conta, tipo_lancamento, historico, valor_lancamento) VALUES (10,&#39;2012-07-13&#39;,&#39;0000284&#39;,&#39;2.2.1&#39;,&#39;S&#39;,NULL,15.00);

&lt;/pre&gt;
&lt;/br&gt;
&lt;/br&gt;
Vamos as querys relatórios...
&lt;/br&gt;
&lt;/br&gt;
Razão Detalhado (Script para Firebird 2.5.1, Oracle 11g R2, Postgres 9.1, SQL Server 2012) 
&lt;/br&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;
-- razao detalhado (Script para Firebird 2.5.1, Oracle 11g R2, Postgres 9.1, SQL Server 2012) 

   SELECT lan.id_lancamento
        , lan.dt_lancamento 
        , lan.numero_doc
        , lan.id_plano_conta
        , lan.tipo_lancamento
        , lan.historico 
        , 
          coalesce(
          (
          SELECT sum
                 ( 
                  CASE WHEN tipo_lancamento = &#39;E&#39; THEN 
                            valor_lancamento
                       WHEN tipo_lancamento = &#39;S&#39; THEN 
                            valor_lancamento * -1 
                       ELSE 
                            0.00
                  END
                 ) 
            FROM lancamento 
            WHERE dt_lancamento &lt; lan.dt_lancamento 
              AND id_plano_conta  = lan.id_plano_conta 
          ),0)  AS saldo_inicial  
        , CASE WHEN tipo_lancamento = &#39;E&#39; THEN 
                    valor_lancamento
               ELSE 
                    0.00 
          END AS entrada 
        , CASE WHEN tipo_lancamento = &#39;S&#39; THEN 
                    valor_lancamento
               ELSE 
                    0.00 
          END AS saida 
        ,  
          coalesce(
          (
          SELECT sum
                 ( 
                  CASE WHEN tipo_lancamento = &#39;E&#39; THEN 
                            valor_lancamento 
                       WHEN tipo_lancamento = &#39;S&#39; THEN 
                            valor_lancamento * -1 
                       ELSE 
                            0.00
                  END
                 ) 
            FROM lancamento
           WHERE dt_lancamento &lt;= lan.dt_lancamento 
             AND id_plano_conta  = lan.id_plano_conta 
          ),0)  AS saldo_final
     FROM lancamento AS lan
     JOIN plano_conta AS plc 
       ON plc.id_plano_conta  = lan.id_plano_conta
    WHERE lan.dt_lancamento &gt;= &#39;2012-07-04&#39;
      AND lan.dt_lancamento &lt;= &#39;2012-07-14&#39;
      AND lan.id_plano_conta  = &#39;2.2.2&#39;
 ORDER BY lan.dt_lancamento ASC 
        ;
&lt;/pre&gt;
&lt;/br&gt;
&lt;/br&gt;
Razão Sumarizado Por Plano de Conta (Script para Firebird 2.5.1, Oracle 11g R2, Postgres 9.1, SQL Server 2012)   
&lt;/br&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;
-- razao sumarizado por plano de conta (Script para Firebird 2.5.1, Oracle 11g R2, Postgres 9.1, SQL Server 2012)   
    SELECT x.id_plano_conta
         , pcx.descricao 
         , coalesce(
           (
            SELECT sum
                   ( 
                    CASE WHEN tipo_lancamento = &#39;E&#39; THEN 
                              valor_lancamento
                         WHEN tipo_lancamento = &#39;S&#39; THEN 
                              valor_lancamento * -1 
                         ELSE 
                              0.00
                     END
                   ) 
              FROM lancamento 
             WHERE dt_lancamento &lt; &#39;2012-07-04&#39;
               AND id_plano_conta  = x.id_plano_conta 
           ),0)  AS saldo_inicial 
         , sum(x.entrada) AS entrada
         , sum(x.saida)   AS saida
         , coalesce(
           (
            SELECT sum
                   ( 
                    CASE WHEN tipo_lancamento = &#39;E&#39; THEN 
                              valor_lancamento 
                         WHEN tipo_lancamento = &#39;S&#39; THEN 
                              valor_lancamento * -1 
                         ELSE 
                              0.00
                    END
                   ) 
              FROM lancamento
             WHERE dt_lancamento &lt;=  &#39;2012-07-14&#39;
               AND id_plano_conta  = x.id_plano_conta 
           ),0)  AS saldo_final
      FROM
         ( 
           SELECT lan.id_plano_conta
                , CASE WHEN tipo_lancamento = &#39;E&#39; THEN 
                            valor_lancamento
                       ELSE 
                            0.00 
                  END AS entrada 
                , CASE WHEN tipo_lancamento = &#39;S&#39; THEN 
                            valor_lancamento
                       ELSE 
                            0.00 
                  END AS saida 
             FROM lancamento AS lan
             JOIN plano_conta AS plc 
               ON plc.id_plano_conta  = lan.id_plano_conta
            WHERE lan.dt_lancamento &gt;= &#39;2012-07-04&#39;
              AND lan.dt_lancamento &lt;= &#39;2012-07-14&#39;
              AND lan.id_plano_conta  = &#39;2.2.2&#39;
         ) AS x
      JOIN plano_conta AS pcx
        ON pcx.id_plano_conta = x.id_plano_conta 
  GROUP BY x.id_plano_conta
         , pcx.descricao
  ORDER BY x.id_plano_conta ASC 
      ;
&lt;/pre&gt;   
&lt;/br&gt;
&lt;/br&gt;   
Balancete Contabil (Script para SQL Server 2012)
&lt;/br&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;
-- balancete contabil (Script para SQL Server 2012) 
  SELECT pcx.id_plano_conta
       , pcx.descricao 
       , sum(xx.saldo_inicial) AS saldo_inicial 
       , sum(xx.entrada)       AS entrada
       , sum(xx.saida)         AS saida 
       , sum(xx.saldo_final)   AS saldo_final 
    FROM
       (
        SELECT x.id_plano_conta
             , coalesce(
               (
                SELECT sum
                       ( 
                        CASE WHEN tipo_lancamento = &#39;E&#39; THEN 
                                  valor_lancamento
                             WHEN tipo_lancamento = &#39;S&#39; THEN 
                                  valor_lancamento * -1 
                             ELSE 
                                  0.00
                        END
                       ) 
                  FROM lancamento 
                 WHERE dt_lancamento &lt; &#39;2012-07-04&#39;
                   AND id_plano_conta  = x.id_plano_conta 
               ),0)  AS saldo_inicial 
             , coalesce(
               (
                SELECT sum
                       ( 
                        CASE WHEN tipo_lancamento = &#39;E&#39; THEN 
                                  valor_lancamento
                             ELSE 
                                  0.00
                        END
                       ) 
                  FROM lancamento 
                 WHERE dt_lancamento &gt;= &#39;2012-07-04&#39;
				   AND dt_lancamento &lt;= &#39;2012-07-14&#39;
                   AND id_plano_conta  = x.id_plano_conta 
               ),0)  AS entrada
             , coalesce(
               (
                SELECT sum
                       ( 
                        CASE WHEN tipo_lancamento = &#39;S&#39; THEN 
                                  valor_lancamento 
                             ELSE 
                                  0.00
                        END
                       ) 
                  FROM lancamento 
                 WHERE dt_lancamento &gt;= &#39;2012-07-04&#39;
				   AND dt_lancamento &lt;= &#39;2012-07-14&#39;
                   AND id_plano_conta  = x.id_plano_conta 
               ),0)  AS saida			 
             , coalesce(
               (
                 SELECT sum
                        ( 
                         CASE WHEN tipo_lancamento = &#39;E&#39; THEN 
                                   valor_lancamento 
                              WHEN tipo_lancamento = &#39;S&#39; THEN 
                                   valor_lancamento * -1 
                              ELSE 
                                   0.00
                         END
                        ) 
                   FROM lancamento
                  WHERE dt_lancamento &lt;=  &#39;2012-07-14&#39;
                    AND id_plano_conta  = x.id_plano_conta 
               ),0)  AS saldo_final
          FROM
             ( 
               SELECT pla.id_plano_conta
			        , lan.dt_lancamento
                    , CASE WHEN lan.tipo_lancamento = &#39;E&#39; THEN 
                                lan.valor_lancamento
                           ELSE 
                                0.00 
                      END AS entrada 
                    , CASE WHEN lan.tipo_lancamento = &#39;S&#39; THEN 
                                lan.valor_lancamento
                           ELSE 
                                0.00 
                      END AS saida 
                 FROM lancamento AS lan
				 JOIN plano_conta AS pla
				   ON pla.id_plano_conta = lan.id_plano_conta 
                WHERE 1=1 
             ) AS x
      GROUP BY x.id_plano_conta
       ) AS xx
    JOIN plano_conta pcx 
      ON xx.id_plano_conta LIKE pcx.id_plano_conta + &#39;%&#39;
GROUP BY pcx.id_plano_conta 
       , pcx.descricao 
ORDER BY pcx.id_plano_conta ASC
       ;   
&lt;/pre&gt;
&lt;/br&gt;
&lt;/br&gt;	  
Balancete Contabil (Script para Firebird 2.5.1, Oracle 11g R2, Postgres 9.1)
&lt;/br&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;  
-- balancete contabil (Script para Firebird 2.5.1, Oracle 11g R2, Postgres 9.1)   
  SELECT pcx.id_plano_conta
       , pcx.descricao 
       , sum(xx.saldo_inicial) AS saldo_inicial 
       , sum(xx.entrada)       AS entrada
       , sum(xx.saida)         AS saida 
       , sum(xx.saldo_final)   AS saldo_final 
    FROM
       (
        SELECT x.id_plano_conta
             , coalesce(
               (
                SELECT sum
                       ( 
                        CASE WHEN tipo_lancamento = &#39;E&#39; THEN 
                                  valor_lancamento
                             WHEN tipo_lancamento = &#39;S&#39; THEN 
                                  valor_lancamento * -1 
                             ELSE 
                                  0.00
                        END
                       ) 
                  FROM lancamento 
                 WHERE dt_lancamento &lt; &#39;2012-07-04&#39;
                   AND id_plano_conta  = x.id_plano_conta 
               ),0)  AS saldo_inicial 
             , coalesce(
               (
                SELECT sum
                       ( 
                        CASE WHEN tipo_lancamento = &#39;E&#39; THEN 
                                  valor_lancamento
                             ELSE 
                                  0.00
                        END
                       ) 
                  FROM lancamento 
                 WHERE dt_lancamento &gt;= &#39;2012-07-04&#39;
				   AND dt_lancamento &lt;= &#39;2012-07-14&#39;
                   AND id_plano_conta  = x.id_plano_conta 
               ),0)  AS entrada
             , coalesce(
               (
                SELECT sum
                       ( 
                        CASE WHEN tipo_lancamento = &#39;S&#39; THEN 
                                  valor_lancamento 
                             ELSE 
                                  0.00
                        END
                       ) 
                  FROM lancamento 
                 WHERE dt_lancamento &gt;= &#39;2012-07-04&#39;
				   AND dt_lancamento &lt;= &#39;2012-07-14&#39;
                   AND id_plano_conta  = x.id_plano_conta 
               ),0)  AS saida			 
             , coalesce(
               (
                 SELECT sum
                        ( 
                         CASE WHEN tipo_lancamento = &#39;E&#39; THEN 
                                   valor_lancamento 
                              WHEN tipo_lancamento = &#39;S&#39; THEN 
                                   valor_lancamento * -1 
                              ELSE 
                                   0.00
                         END
                        ) 
                   FROM lancamento
                  WHERE dt_lancamento &lt;=  &#39;2012-07-14&#39;
                    AND id_plano_conta  = x.id_plano_conta 
               ),0)  AS saldo_final
          FROM
             ( 
               SELECT pla.id_plano_conta
			        , lan.dt_lancamento
                    , CASE WHEN lan.tipo_lancamento = &#39;E&#39; THEN 
                                lan.valor_lancamento
                           ELSE 
                                0.00 
                      END AS entrada 
                    , CASE WHEN lan.tipo_lancamento = &#39;S&#39; THEN 
                                lan.valor_lancamento
                           ELSE 
                                0.00 
                      END AS saida 
                 FROM lancamento AS lan
				 JOIN plano_conta AS pla
				   ON pla.id_plano_conta = lan.id_plano_conta 
                WHERE 1=1 
             ) AS x
      GROUP BY x.id_plano_conta
       ) AS xx
    JOIN plano_conta pcx 
      ON xx.id_plano_conta LIKE pcx.id_plano_conta || &#39;%&#39;
GROUP BY pcx.id_plano_conta 
       , pcx.descricao 
ORDER BY pcx.id_plano_conta ASC
       ; 
&lt;/pre&gt;
&lt;/br&gt;
&lt;/br&gt;	   
Figura 01 - Resultado das Querys 
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8HPMEzdchybEQdYu7ReLbcxLNALBubC2Zud2AFGeBDuB1CNxNlceYuj3I5-5jzJa9kwuj7-wzbcsO3EmSBHVhJSG5wtveNo7IFtwwCi_GVXKp-qPidG_a2QLQ83vM2v-z7-QdF-MvAvM/s1600/resultado_das_querys.png&quot; imageanchor=&quot;1&quot; style=&quot;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;158&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8HPMEzdchybEQdYu7ReLbcxLNALBubC2Zud2AFGeBDuB1CNxNlceYuj3I5-5jzJa9kwuj7-wzbcsO3EmSBHVhJSG5wtveNo7IFtwwCi_GVXKp-qPidG_a2QLQ83vM2v-z7-QdF-MvAvM/s400/resultado_das_querys.png&quot; /&gt;&lt;/a&gt;
&lt;/br&gt;
&lt;/br&gt;   
Para facilitar, caso haja interesse, recomendo criar views ou functions ou procedures das querys acimas, pois são demasiadamente extensas. 
&lt;/br&gt;
&lt;/br&gt;
Mais uma vez espero ter ajudado. 
&lt;/br&gt;
&lt;/br&gt;
APDSJ! 
&lt;/br&gt;
&lt;/br&gt;</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/759822284891096364/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2013/01/desenvolvendo-querys-sql-para-razao-e.html#comment-form' title='34 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/759822284891096364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/759822284891096364'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2013/01/desenvolvendo-querys-sql-para-razao-e.html' title='Desenvolvendo querys SQL para Razão e Balancete Contábil. '/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMk2BQoMvwmDs5kQlQur1S-8OM9HeRc9iUpEnOcPNZ7esrWXcSRkj2IYZb6wvCxKYPpKIeTEmiBePQO-4cUQTSm4X5qrd43Phj8P-JqLQisC88xql0yoaoFtVT7UmUMFcCO_DaA4h4axU/s72-c/moedas_ouro.jpg" height="72" width="72"/><thr:total>34</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-9040575058068159618</id><published>2012-09-19T22:21:00.000-03:00</published><updated>2012-09-20T10:26:05.392-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Formatar CNPJ em SQL</title><content type='html'>Store function para formatar CNPJ em SQL Server 
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;
IF EXISTS (
            SELECT * 
              FROM sys.objects 
             WHERE object_id = OBJECT_ID(N&#39;[dbo].[usf_formata_cnpj]&#39;) 
               AND type IN (N&#39;FN&#39;)
           )
 DROP FUNCTION dbo.usf_formata_cnpj;
GO
 
CREATE FUNCTION dbo.usf_formata_cnpj(@cnpj varchar(max), @mascara bit) RETURNS varchar(max) 
AS
-- Nome Artefato/Programa..: usf_formata_cnpj.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com) 
-- Data Inicio ............: 19/09/2012
-- Data Atualizacao........: 19/09/2012
-- Versao..................: 0.01
-- Compilador/Interpretador: T-SQL (Transact SQL) 
-- Sistemas Operacionais...: Windows
-- SGBD....................: MS SQL Server 2005/2008
-- Kernel..................: Nao informado!
-- Finalidade..............: Store Procedure (Function) para mascara o numero do CNPJ
-- OBS.....................: A entrada é um varchar e o retorno é um varchar formatado do CNPJ, parametro mascara setado em 0 apenas string com zeros, 1 formata o CNPJ de fato 
-- ........................: 
--  
BEGIN
 
  DECLARE @cnpj_temp varchar(max) 
   
  -- Pre-validacao 1, se e nulo, entao retorna nulo
  IF @cnpj IS NULL BEGIN
     RETURN (@cnpj)  
  END --fim_se      
 
  -- Pre-validacao 2, se e maior que 14 digitos , entao retorna 0 
  IF LEN(@cnpj) &gt; 14 BEGIN
     RETURN (@cnpj)
  END --fim_se
   
  -- Pre-validacao 3, se e tem alguma letra no CNPJ, entao retorna 0 
  IF (SELECT CASE WHEN patindex(&#39;%[^0-9]%&#39;, @cnpj) &gt; 0 THEN 1 ELSE 0 END) = 1 BEGIN
     RETURN (@cnpj)
  END --fim_se  
 
  -- Pre-validacao 4, se e menor que 14 dig, pode ser oriundo de um bigint, entao colocar zeros a frente
  SET @cnpj_temp = @cnpj
  IF LEN(@cnpj) &lt; 14 BEGIN
     SET @cnpj_temp = REPLICATE(&#39;0&#39;,14-LEN(@cnpj))+@cnpj
  END --fim_se 
   
  -- Se e para formatar mesmo 
  IF @mascara = 1 BEGIN
     SET @cnpj_temp = SUBSTRING(@cnpj_temp,1,2) + &#39;.&#39; + SUBSTRING(@cnpj_temp,3,3) + &#39;.&#39; + SUBSTRING(@cnpj_temp,6,3) + &#39;/&#39; + SUBSTRING(@cnpj_temp,9,4) + &#39;-&#39; + SUBSTRING(@cnpj_temp,13,2) 
  END --fim_se 
   
  RETURN (@cnpj_temp) 
   
END;
GO
 
-- chamada da function 

-- test 1
SELECT dbo.usf_formata_cnpj(&#39;00000000000191&#39;,1); -- Banco do Brasil Sede - 00.000.000/0001-91
SELECT dbo.usf_formata_cnpj(&#39;00000000000191&#39;,0); -- Banco do Brasil Sede - 00000000000191
-- test 2 
SELECT dbo.usf_formata_cnpj(&#39;191&#39;,1); -- Banco do Brasil Sede - 00.000.000/0001-91
SELECT dbo.usf_formata_cnpj(&#39;191&#39;,0); -- Banco do Brasil Sede - 00000000000191

&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/9040575058068159618/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2012/09/formatar-cnpj-em-sql.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/9040575058068159618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/9040575058068159618'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2012/09/formatar-cnpj-em-sql.html' title='Formatar CNPJ em SQL'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-5117846564257757991</id><published>2012-09-19T22:00:00.000-03:00</published><updated>2012-09-20T10:26:23.910-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Validar CNPJ em SQL</title><content type='html'>Como validar CNPJ em SQL Server, store function para validar CNPJ em T-SQL (Transact-SQL) 
&lt;br /&gt;
&lt;br /&gt;
Esta store function, foi desenvolvida pensando no armazenamento do CNPJ em BIGINT, mas pode ser usada facilmente sem adaptações com CNPJ tipo VARCHAR(14) sem mascaras ou formatações.
&lt;br /&gt;
&lt;br /&gt;
Recomendável persistência do CNPJ em BIGINT por motivo principal de desempenho. 
&lt;br /&gt;
&lt;br /&gt;
Segue function.... 
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;
IF EXISTS (
            SELECT * 
              FROM sys.objects 
             WHERE object_id = OBJECT_ID(N&#39;[dbo].[usf_valida_cnpj]&#39;) 
               AND type IN (N&#39;FN&#39;)
           )
 DROP FUNCTION dbo.usf_valida_cnpj;
GO
 
CREATE FUNCTION dbo.usf_valida_cnpj(@cnpjx varchar(14)) RETURNS bit
AS
-- Nome Artefato/Programa..: usf_valida_cnpj.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com) baseado em Script feito por:
-- ........................: Baseado em código de Fernando Jacinto da Silva em http://www.devmedia.com.br
-- Data Inicio ............: 18/09/2011
-- Data Atualizacao........: 19/09/2012
-- Versao..................: 0.02
-- Compilador/Interpretador: T-SQL (Transact SQL) 
-- Sistemas Operacionais...: Windows
-- SGBD....................: MS SQL Server 2005/2008
-- Kernel..................: Nao informado!
-- Finalidade..............: Store Procedure (Function) para validar o numero do CNPJ
-- OBS.....................: A entrada é um varchar e o retorno é um bit, 1 para válido, 0 para inválido e null para nulos 
-- ........................: 
--  
BEGIN

DECLARE
        @cnpj   varchar(14) 
      , @indice int
      , @soma   int
      , @dig1   int
      , @dig2   int
      , @var1   int
      , @var2   int
      , @resultado bit

    SET @cnpj = @cnpjx 
    SET @soma = 0
    SET @indice = 1
    SET @resultado = 0

    -- pre-validacao 1, se e nulo, entao retorna nulo
    IF @cnpj IS NULL BEGIN
        SET @resultado = NULL
        RETURN (@resultado)  
    END --fim_se      
 
    -- pre-validacao 2, se e maior que 11 digitos , entao retorna 0 
    IF LEN(@cnpj) &gt; 14 BEGIN
        SET @resultado = 0 
        RETURN (@resultado)
    END --fim_se
   
    -- pre-validacao 3, se e tem alguma letra no cpf, entao retorna 0 
    IF (SELECT CASE WHEN patindex(&#39;%[^0-9]%&#39;, @cnpj) &gt; 0 THEN 1 ELSE 0 END) = 1 BEGIN
       SET @resultado = 0
       RETURN (@resultado)
    END --fim_se   
 
    -- pre-validacao 4, se e menor que 11 digitos , pode ser oriundo de bigint, então fazer tratamento de zeros 
    IF LEN(@cnpj) &lt; 14 BEGIN
        SET @cnpj = REPLICATE(&#39;0&#39;,14-LEN(@cnpj))+@cnpj
    END --fim se 
 
    /* algorítimo para o primeiro dígito 543298765432 */
    /* cálculo do 1º dígito */
    /* cálculo da 1ª parte do algorítiom 5432 */

    SET @var1 = 5 /* 1a parte do algorítimo começando de &quot;5&quot; */

    WHILE (@indice &lt;= 4) BEGIN

        SET @soma = @soma + CONVERT(int,SUBSTRING(@cnpj,@indice,1)) * @var1

        SET @indice = @indice + 1 /* navegando um-a-um até &lt; = 4, as quatro primeira posições */

        SET @var1 = @var1 - 1  /* subtraindo o algorítimo de 5 até 2 */

    END

    /* cálculo da 2ª parte do algorítiom 98765432 */

    SET @var2 = 9

    WHILE (@indice &lt;= 12) BEGIN

        SET @soma = @soma + CONVERT(int,SUBSTRING(@cnpj,@indice,1)) * @var2

        SET @indice = @indice + 1

        SET @var2 = @var2 - 1            
    END

    SET @dig1 = (@soma % 11)

    /* se o resto da divisão for &lt; 2, o digito = 0 */

    IF @dig1 &lt; 2 BEGIN

        SET @dig1 = 0

    END ELSE BEGIN /* se o resto da divisão não for &lt; 2*/

        SET @dig1 = 11 - (@soma % 11)
    END

    /* cálculo do 2º dígito */
    /* zerando o indice e a soma para começar a calcular o 2º dígito*/   

    SET @indice = 1
    SET @soma = 0

    /* cálculo da 1ª parte do algorítiom 65432 */

    SET @var1 = 6 /* 2a parte do algorítimo começando de &quot;6&quot; */

    SET @resultado = 0  

    WHILE (@indice &lt;= 5) BEGIN
  
        SET @soma = @soma + CONVERT(int,SUBSTRING(@cnpj,@indice,1)) * @var1
        SET @indice = @indice + 1 /* navegando um-a-um até &lt; = 5, as quatro primeira posições */
        SET @var1 = @var1 - 1       /* subtraindo o algorítimo de 6 até 2 */

    END

    /* cálculo da 2ª parte do algorítiom 98765432 */
    SET @var2 = 9

    WHILE (@indice &lt;= 13) BEGIN

        SET @soma = @soma + CONVERT(int,SUBSTRING(@cnpj,@indice,1)) * @var2
        SET @indice = @indice + 1
        SET @var2 = @var2 - 1            

    END
 
    SET @dig2 = (@soma % 11) 

    /* se o resto da divisão for &lt; 2, o digito = 0 */

    IF @dig2 &lt; 2 BEGIN

        SET @dig2 = 0

    END ELSE BEGIN /* se o resto da divisão não for &lt; 2*/

        SET @dig2 = 11 - (@soma % 11)
    END
 
    -- validando

    IF (@dig1 = SUBSTRING(@cnpj,LEN(@cnpj)-1,1)) AND (@dig2 = SUBSTRING(@cnpj,LEN(@cnpj),1)) BEGIN

        SET @resultado = 1

    END ELSE BEGIN

        SET @resultado = 0 
  
    END 

RETURN (@resultado)

END;
GO

-- chamada da function 

-- test 1
SELECT dbo.usf_valida_cnpj(&#39;00000000000191&#39;); -- Banco do Brasil Sede - 1 (válido)
-- test 2 
SELECT dbo.usf_valida_cnpj(&#39;191&#39;); -- Banco do Brasil Sede - 1 (válido)
-- test 3
SELECT dbo.usf_valida_cnpj(&#39;00000000000192&#39;); -- Banco do Brasil Sede - 0 (inválido) 

&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/5117846564257757991/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2012/09/validar-cnpj-em-sql.html#comment-form' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/5117846564257757991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/5117846564257757991'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2012/09/validar-cnpj-em-sql.html' title='Validar CNPJ em SQL'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-5015709267041542373</id><published>2012-09-19T14:22:00.000-03:00</published><updated>2012-09-19T15:03:15.230-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Cache de memória do SQL Server</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy_7qZkJ1sCJKJL94m6MhBxTzrrK066rwyOQ-h-qXfXVUVsYEVWT2YnLyayVv1bz4YI3615aNJfxOHkgSD1W5L-iz79r-w7Gy9IuY-ZUDXyvLfPMMp5TODwCKtLAE2qqd1KSfZDkqNuh4/s1600/relogio_cronometro.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear:right; float:right; margin-left:1em; margin-bottom:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;224&quot; width=&quot;225&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy_7qZkJ1sCJKJL94m6MhBxTzrrK066rwyOQ-h-qXfXVUVsYEVWT2YnLyayVv1bz4YI3615aNJfxOHkgSD1W5L-iz79r-w7Gy9IuY-ZUDXyvLfPMMp5TODwCKtLAE2qqd1KSfZDkqNuh4/s320/relogio_cronometro.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;


O cache de memória, é uma área de memória reservada pelo SQL Server, com o objetivo de se evitar ao máximo acesso ao disco magnético, pois o barramento deste periférico é bem inferior ao da memória e do processador, analogamente seria como sistema de encanamento com canos pequenos e grandes, mas para manter a vazão cria-se um caixa de água na mudança de diâmetro desses canos, o cache de memória é a caixa de água, sendo assim a entrada e a saída no meio magnético (Imput-Output, I/O) será reduzida, acelerando a execução de procedures, transações, querys que são processadas com maior maior frequência.
&lt;br/ &gt;
&lt;br/ &gt;
Quando o SQL Server começa apresentar lentidão e as operações começam a mostrar erros devido à falta de memória, ou muitas operações de I/O, neste caso recomenda-se, verificar a necessidade de redimensionar a memória do servidor SQL Server. 
&lt;br/ &gt;
&lt;br/ &gt;
No momento que o servidor SQL Server é reinicializado toda a memória cache é automaticamente zerada, isto é limpa, porém em servidor de produção, esse procedimento torna-se inviável, neste cenário o ideal seria redimensionar o servidor, porém como forma paliativa, são sugeridos três comandos que podem ser úteis, são eles:
&lt;br/ &gt;
&lt;pre class=&quot;brush:sql&quot;&gt;
-- limpa as entradas do cache do sistema
DBCC FREESYSTEMCACHE; 
-- limpa as entradas do cache da sessao 
DBCC FREESESSIONCACHE;
-- elimina todas as entradas do cache de procedures
DBCC FREEPROCCACHE;
&lt;/pre&gt;
Quando executado os três comandos acima no servidor, será limpado a memória cache e por conseguinte liberado memória de forma imediata para o SQL Server.
&lt;br/ &gt;
&lt;br/ &gt;
Outra forma de liberar memória cache é na otimização de consultas no SQL Server, bem comum compararmos diferentes formas de construção de uma consulta (query), normalmente dentro de uma mesma sessão no SQL Server, por examplo usando MS SQL Server Management Studio.
&lt;br/ &gt;
&lt;br/ &gt;
O grande moído é que a primeira consulta (query) a ser executada, sempre é mais rápido do que a primeira, pois na primeira vez em que é executada ela é armazenada na memória cache e já segunda em diante a execução se baseia na memória cache. 
&lt;br/ &gt;
&lt;br/ &gt;
Analisando com critério a query executada, faz-se necessário sempre evitar o uso do cache, ao menos no momento de otimização de consultas. 
&lt;br/ &gt;
&lt;br/ &gt;
Três comandos simples a ser executado na sessão Management Studio para solucionar, eliminar, desprezar o cache de memória, são eles:
&lt;br/ &gt;
&lt;pre class=&quot;brush:sql&quot;&gt;
-- elimina paginas de buffer limpas
DBCC DROPCLEANBUFFERS;
-- elimina todas as entradas do cache de procedures
DBCC FREEPROCCACHE;
-- limpa as entradas de cache nao utilizadas 
DBCC FREESYSTEMCACHE ( &#39;ALL&#39; );
&lt;/pre&gt;
&lt;br/ &gt;
A dica, é executar esses três comandos supracitados, no momento de otimizar querys.
&lt;br/ &gt;
&lt;br/ &gt;
Fique na Paz do Senhor Jesus! 
&lt;br/ &gt;</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/5015709267041542373/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2012/09/cache-de-memoria-do-sql-server.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/5015709267041542373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/5015709267041542373'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2012/09/cache-de-memoria-do-sql-server.html' title='Cache de memória do SQL Server'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy_7qZkJ1sCJKJL94m6MhBxTzrrK066rwyOQ-h-qXfXVUVsYEVWT2YnLyayVv1bz4YI3615aNJfxOHkgSD1W5L-iz79r-w7Gy9IuY-ZUDXyvLfPMMp5TODwCKtLAE2qqd1KSfZDkqNuh4/s72-c/relogio_cronometro.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-4106571340120456091</id><published>2012-09-06T15:05:00.000-03:00</published><updated>2013-08-28T13:12:00.534-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmos"/><category scheme="http://www.blogger.com/atom/ns#" term="Oracle"/><category scheme="http://www.blogger.com/atom/ns#" term="Postgres"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Consulta SQL de Plano de Contas - Query Contabil - Query para Centro de Custo</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBHANvuN3eTy6ng_8w8AGMg0VrbjArPYlBrEBZEjUEjc4FbwIeZrCJ8VRF8ZfplF3ImYkZSBsBNcVgPnyDTjqTL6ue9k8-BidpBL2QBoBZqr2RGVZGfHhzpxaW3b20xjd20A-LwGPfaYw/s1600/cifrao_seta_subindo.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;189&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBHANvuN3eTy6ng_8w8AGMg0VrbjArPYlBrEBZEjUEjc4FbwIeZrCJ8VRF8ZfplF3ImYkZSBsBNcVgPnyDTjqTL6ue9k8-BidpBL2QBoBZqr2RGVZGfHhzpxaW3b20xjd20A-LwGPfaYw/s400/cifrao_seta_subindo.png&quot; width=&quot;150&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
A idéia primordial desse artigo é demonstrar como desenvolver uma query sql usando um plano de contas ou centro de custo, o principio é o mesmo, subtotalizando de forma invertida, considerando uma estrutura de balancete ou centro de custo, mas sempre usando um plano de contas com contas analiticas e sintéticas e vários niveis de sub-contas.&lt;br /&gt;
&lt;br /&gt;
O SGBDR testados foram:&lt;br /&gt;
&amp;nbsp;Firebird 2.5.1&lt;br /&gt;
&amp;nbsp;Postgres 9.1&lt;br /&gt;
&amp;nbsp;SQL Server 2012&lt;br /&gt;
&amp;nbsp;Oracle 11g R2&lt;br /&gt;
&lt;br /&gt;
Expondo o problema, exemplo:&lt;br /&gt;
&lt;br /&gt;
Montar uma query relatório que mostre o resultado totalizado por níveis de contas lançadas.&lt;br /&gt;
O centro de custo irá ser lançado sempre no ultimo nivel e/ou conta analitica, ou seja 1.1.1 ou 1.2.1, etc.&amp;nbsp;
&lt;br /&gt;
&lt;br /&gt;
Conforme figura Figura 01, abaixo: 

&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC4puOK-6mkB18jfRzcyEB5tyqJhc4e6xtoGqDxZt4rd8z5Fo_vRiajfOkLcN9IlSITzUTKF9f5x4jtOCDdarvz0zotv3Yk-RneQ__j5a7BsJLY2hyXKk0X5-zHx67QHXB7s4cwiAXqPA/s1600/relatorio_centro_custo.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;145&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC4puOK-6mkB18jfRzcyEB5tyqJhc4e6xtoGqDxZt4rd8z5Fo_vRiajfOkLcN9IlSITzUTKF9f5x4jtOCDdarvz0zotv3Yk-RneQ__j5a7BsJLY2hyXKk0X5-zHx67QHXB7s4cwiAXqPA/s640/relatorio_centro_custo.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
Figura 01 - Relatório Sumarizado por Plano de Contas&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Temos uma estrutura de centro de custo modelada da seguinte maneira:&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Script para Firebird 2.5.1, Postgres 9.1, SQL Server 2012, Oracle 11g R2

&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;&lt;/pre&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;&lt;/pre&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;-- USE tempdb; -- Descomentar caso use SQL Server 
--DROP TABLE centro_custo;
CREATE TABLE centro_custo
( 
   id_centro_custo  varchar(12) PRIMARY KEY   -- dados da conta ex. 1.02.01 
 , descricao        varchar(50)               -- descricao da conta cadastrada ex. Vendas Externas
 , tipo_conta       varchar(1)                -- tipo de conta do cc Analitica ou Sintética, dominio discreto: A ou S, em situação de produção merece uma constraint check
); 

--DROP TABLE movimento;
CREATE TABLE movimento 
(
   id_movimento   integer   PRIMARY KEY  -- id do movimento, recomenda-se auto incremento, mas para simplifcar fica sem auto incremento
 , numero_doc   varchar(40)              -- numero do documento a ser informado  
 , id_centro_custo   varchar(12)         -- chave estrangeira para a tabela centro de custo, mas para simplificar apenas iremos convencionar, não será habilitado a FK, recomendo colocar not null
 , valor_movimento numeric(15,2)         -- valor informado 
);
&lt;/pre&gt;
&lt;br /&gt;
Agora iremos povoar a tabela de centro de custo 

&lt;br /&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;&lt;/pre&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;-- Receitas 

INSERT INTO centro_custo (id_centro_custo, descricao, tipo_conta) VALUES (&#39;1&#39;,&#39;Receita&#39;,&#39;S&#39;);
INSERT INTO centro_custo (id_centro_custo, descricao, tipo_conta) VALUES (&#39;1.1&#39;,&#39;Vendas Internas&#39;,&#39;S&#39;);
INSERT INTO centro_custo (id_centro_custo, descricao, tipo_conta) VALUES (&#39;1.1.1&#39;,&#39;Escola&#39;,&#39;A&#39;);
INSERT INTO centro_custo (id_centro_custo, descricao, tipo_conta) VALUES (&#39;1.1.2&#39;,&#39;Escritório&#39;,&#39;A&#39;);
INSERT INTO centro_custo (id_centro_custo, descricao, tipo_conta) VALUES (&#39;1.2&#39;,&#39;Vendas Externas&#39;,&#39;S&#39;);
INSERT INTO centro_custo (id_centro_custo, descricao, tipo_conta) VALUES (&#39;1.2.1&#39;,&#39;Livro&#39;,&#39;A&#39;);
INSERT INTO centro_custo (id_centro_custo, descricao, tipo_conta) VALUES (&#39;1.2.2&#39;,&#39;Brinquedos&#39;,&#39;A&#39;);

-- Despesas

INSERT INTO centro_custo (id_centro_custo, descricao, tipo_conta) VALUES (&#39;2&#39;,&#39;Despesas&#39;,&#39;S&#39;);
INSERT INTO centro_custo (id_centro_custo, descricao, tipo_conta) VALUES (&#39;2.1&#39;,&#39;Fornecedores&#39;,&#39;S&#39;);
INSERT INTO centro_custo (id_centro_custo, descricao, tipo_conta) VALUES (&#39;2.1.1&#39;,&#39;Nacional&#39;,&#39;A&#39;);
INSERT INTO centro_custo (id_centro_custo, descricao, tipo_conta) VALUES (&#39;2.1.2&#39;,&#39;Importado&#39;,&#39;A&#39;);
INSERT INTO centro_custo (id_centro_custo, descricao, tipo_conta) VALUES (&#39;2.2&#39;,&#39;Escritório&#39;,&#39;S&#39;);
INSERT INTO centro_custo (id_centro_custo, descricao, tipo_conta) VALUES (&#39;2.2.1&#39;,&#39;Materiais de limpeza&#39;,&#39;A&#39;);
INSERT INTO centro_custo (id_centro_custo, descricao, tipo_conta) VALUES (&#39;2.2.2&#39;,&#39;Materiais de Escritório&#39;,&#39;A&#39;);

-- Vamos povoar a tabela movimento: 

INSERT INTO movimento (id_movimento, numero_doc, id_centro_custo, valor_movimento) VALUES (1,&#39;0000021&#39;,&#39;1.1.2&#39;,50.00);
INSERT INTO movimento (id_movimento, numero_doc, id_centro_custo, valor_movimento) VALUES (2,&#39;0000042&#39;,&#39;1.2.2&#39;,100.00);
INSERT INTO movimento (id_movimento, numero_doc, id_centro_custo, valor_movimento) VALUES (3,&#39;0000084&#39;,&#39;1.2.2&#39;,160.00);

INSERT INTO movimento (id_movimento, numero_doc, id_centro_custo, valor_movimento) VALUES (4,&#39;0000142&#39;,&#39;2.2.1&#39;,40.00);
INSERT INTO movimento (id_movimento, numero_doc, id_centro_custo, valor_movimento) VALUES (5,&#39;0000210&#39;,&#39;2.2.2&#39;,80.00);
INSERT INTO movimento (id_movimento, numero_doc, id_centro_custo, valor_movimento) VALUES (6,&#39;0000242&#39;,&#39;2.2.2&#39;,20.00);
INSERT INTO movimento (id_movimento, numero_doc, id_centro_custo, valor_movimento) VALUES (7,&#39;0000284&#39;,&#39;2.2.1&#39;,15.00);
&lt;/pre&gt;
&lt;br /&gt;
Listando os centros de custos cadastrados ... 
&lt;br /&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;-- Listando conteudo de centro_custo 
SELECT * FROM centro_custo ORDER BY 1;
&lt;/pre&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOp2rev9k4L4sjww3cgeznTbdtq-Xr1cfHN_sS1-p8hsHsknXMrNM1vgV52H-CDCxZjxo2wFREL-YcXg-v4KyfBQgHts0XrNyC4a8msVJhqR-OPlEW8Rp4oGjUwNkpNddDDIHU2kh9C6M/s1600/lista_centro_custo.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOp2rev9k4L4sjww3cgeznTbdtq-Xr1cfHN_sS1-p8hsHsknXMrNM1vgV52H-CDCxZjxo2wFREL-YcXg-v4KyfBQgHts0XrNyC4a8msVJhqR-OPlEW8Rp4oGjUwNkpNddDDIHU2kh9C6M/s640/lista_centro_custo.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
Figura 02 - Lista de Centro Custo 



&lt;/div&gt;
&lt;br /&gt;
Listando os movimentos cadastrados, referenciando os centros de custos ... 
&lt;br /&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;-- Listando conteudo de movimento 
SELECT * FROM movimento;
&lt;/pre&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz43GdXuXkA3pEVYUg3-2uYR-PCyqwIpvK2jcXMadWaBC1DoKZ-4tPb-J64vME_fARTjvgHvGstIKHd41-SW-RStW3iNVld-KbzNlLJbE7d-fw0i5AXdoVj1iNpwLIWsu7phmeLO5F9WI/s1600/lista_movimento.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;217&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz43GdXuXkA3pEVYUg3-2uYR-PCyqwIpvK2jcXMadWaBC1DoKZ-4tPb-J64vME_fARTjvgHvGstIKHd41-SW-RStW3iNVld-KbzNlLJbE7d-fw0i5AXdoVj1iNpwLIWsu7phmeLO5F9WI/s640/lista_movimento.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
Figura 03 - Lista de Movimento 



Script apenas para SQL Server 2012

&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;-- Query SQL Centro de Custo, para SQL Server 2012, exemplo: 
  SELECT cc.id_centro_custo
       , cc.descricao 
       , sum(m.valor_movimento) AS total_conta 
    FROM centro_custo cc 
    JOIN movimento m
      ON m.id_centro_custo LIKE cc.id_centro_custo + &#39;%&#39;  -- O segredo está aqui, o campo id_centro_custo vem depois do LIKE
GROUP BY cc.id_centro_custo 
       , cc.descricao 
ORDER BY cc.id_centro_custo ASC
       ; 
&lt;/pre&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEr2xcOEtXRTnKqxZlTDB_k_MnGAeRPmKdgKzXUSRq_KhTVxRs_9MvG8xQeeEp5_yseTVif89ejZH263nbYkNKEYFp9OzONt5pJ-ie5oSqzRO9n2DhapQNfxl10gK45Q2R0185kr1c66k/s1600/query_centro_custo.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;304&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEr2xcOEtXRTnKqxZlTDB_k_MnGAeRPmKdgKzXUSRq_KhTVxRs_9MvG8xQeeEp5_yseTVif89ejZH263nbYkNKEYFp9OzONt5pJ-ie5oSqzRO9n2DhapQNfxl10gK45Q2R0185kr1c66k/s640/query_centro_custo.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
Figura 04 - Query Centro Custo com Resultado em SQL Server 2012&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Script apenas para Firebird 2.5.1, Postgres 9.1, Oracle 11g R2

&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;  
-- Query SQL Centro de Custo, para Firebird 2.5.1, Postgres 9.1, Oracle 11g R2, exemplo: 
  SELECT cc.id_centro_custo
       , cc.descricao 
       , sum(m.valor_movimento) AS total_conta 
    FROM centro_custo cc 
    JOIN movimento m
      ON m.id_centro_custo LIKE cc.id_centro_custo || &#39;%&#39;  -- O segredo está aqui, o campo id_centro_custo vem depois do LIKE
GROUP BY cc.id_centro_custo 
       , cc.descricao 
ORDER BY cc.id_centro_custo ASC
       ; 
&lt;/pre&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrQkp4HUyXUF0IQoeFLucKo5O_b_1PLrLqienpveW6lhU_8iu1NBDfQSVBw1iiv09QXJxwWpodYM-mwCCTZ9d95zxe_r8Puntn8lLv_A9Y9v3StGOGJKsfsPajvfuQb-1W8eC4rhACaXs/s1600/query_centro_custo_oracle.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;334&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrQkp4HUyXUF0IQoeFLucKo5O_b_1PLrLqienpveW6lhU_8iu1NBDfQSVBw1iiv09QXJxwWpodYM-mwCCTZ9d95zxe_r8Puntn8lLv_A9Y9v3StGOGJKsfsPajvfuQb-1W8eC4rhACaXs/s640/query_centro_custo_oracle.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
Figura 05 - Query Centro Custo com Resultado em Oracle 11g R2&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
A grande dica está na junção dos campos de conta usando like concatenado com &#39;%&#39; no final 
&lt;br /&gt;
&lt;br /&gt;
Como no exemplo com Oracle 11g R2, abaixo descrito:
&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;b&gt;ON m.id_centro_custo LIKE cc.id_centro_custo || &#39;%&#39; &lt;/b&gt; &lt;/i&gt;
&lt;br /&gt;
&lt;br /&gt;
Existem outras formas de se chegar ao mesmo resultado, uma delas seria implementar union em contas de grupo e depois criar uma view, mas, fica complicado e não elegante, já que, será necessário alterar a query toda vez que o plano de contas mudar a estrutura.&lt;br /&gt;
&lt;br /&gt;
Outra forma seria usar querys recursivas, que seria bem mais elegante que a opção anterior, entretanto, mais complexa, mas quanto ao uso de recursividade em querys, nem todos os SGBDRs atualmente dão suporte a essa técnica, outro problema reside no fato do desempenho e consumo de recursos, pois quanto mais níveis tiver o plano de contas maior será a pilha, em outras palavras, consumo de memória e processamento no servidor do banco de dados alto.  
&lt;br /&gt;
&lt;br /&gt;
Eu particularmente já tive a oportunidade fazer parte de uma equipe de desenvolvimento, em que o meu chefe e a própria equipe insistiram em  traçar uma modelagem que usava querys recursivas, apesar de não concordar, como era novato na equipe, não me deram crédito, então me reservei a sabedoria do silêncio e mesmo não concordando aproveitei a oportunidade para fazer acontecer e vê como ficaria um sistema de custos com uso maciço de querys recursivas, foi divertido, mas ainda não recomendo, pois a complexidade é alta das querys recursivas e da codificação da aplicação também, tornando o compartilhamento do conhecimento difícil, como também a manutenção da aplicação, considerando ainda o consumo extremo de memória e processamento a nível de infra-estrutura. 
&lt;br /&gt;
&lt;br /&gt;
Mais uma vez espero ter ajudado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fique na Paz do Senhor Jesus Cristo !!! </content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/4106571340120456091/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2012/09/consulta-sql-de-plano-de-contas-query.html#comment-form' title='49 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/4106571340120456091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/4106571340120456091'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2012/09/consulta-sql-de-plano-de-contas-query.html' title='Consulta SQL de Plano de Contas - Query Contabil - Query para Centro de Custo'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBHANvuN3eTy6ng_8w8AGMg0VrbjArPYlBrEBZEjUEjc4FbwIeZrCJ8VRF8ZfplF3ImYkZSBsBNcVgPnyDTjqTL6ue9k8-BidpBL2QBoBZqr2RGVZGfHhzpxaW3b20xjd20A-LwGPfaYw/s72-c/cifrao_seta_subindo.png" height="72" width="72"/><thr:total>49</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-6606353800083962778</id><published>2012-08-28T14:45:00.000-03:00</published><updated>2014-12-08T11:17:49.533-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Storing and Retrieving Images from SQL Server using Store Procedures in Transact-SQL - Armazenando e Recuperando Imagens do SQL Server usando Store Procedures em Transact-SQL</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK-hfKM9ms79maMMG8qVtKIS2U_7t3FqDH2cSFyyxW1QSPg0UOcd5BSqlcNWnFpxELV-mT3g6owJFlBLv1JdjNXY4S6Ok_w1Hol2mCWjFisEcnekTNkNvbHWhX4Zc0zy3f4p-yJxOuLEI/s1600/Koala.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear:right; float:right; margin-left:1em; margin-bottom:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;150&quot; width=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK-hfKM9ms79maMMG8qVtKIS2U_7t3FqDH2cSFyyxW1QSPg0UOcd5BSqlcNWnFpxELV-mT3g6owJFlBLv1JdjNXY4S6Ok_w1Hol2mCWjFisEcnekTNkNvbHWhX4Zc0zy3f4p-yJxOuLEI/s200/Koala.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

In SQL Server does not have the capability to export a varbinary (BLOB) images directly via SQL, for the Operating System (Windows), just as import, export is done via SSRS or using any programming language, but it was developed a stored procedure called usp_lo_export, below, follows the solution to the problem in question.
&lt;/br&gt;
&lt;/br&gt;
No SQL Server não tem o recurso para exportar um varbinary (blob), imagens,  diretamente via SQL, para o Sistema Operacional (Windows), apenas como importar, a exportação é feita via SSRS ou usando alguma linguagem de programação, mas para isso foi desenvolvido uma store procedure chamada usp_lo_export, abaixo, segue a solução para o problema em questão. 
&lt;/br&gt; 
&lt;/br&gt;



Configuration for SQL Server 2008/2012 
&lt;pre class=&quot;brush:sql&quot;&gt;
-- 
-- Functionality over safety
-- Funcionalidade em detrimento da segurança

-- Routine Tested in SQL SERVER 2008 Enterprise and SQL SERVER 2012 Enterprise
-- Procedimento Testado no SQL SERVER 2008 Enterprise e SQL SERVER 2012 Enterprise

-- Configuration for SQL Server procedure call xp_cmdshell
-- Configuracao do SQL Server para chamada de procedure xp_cmdshell
USE master; 
GO

EXEC sp_configure &#39;show advanced options&#39;, 1
GO
RECONFIGURE
GO
EXEC sp_configure &#39;xp_cmdshell&#39;, 1
GO
RECONFIGURE
GO

-- make dir c:\images
EXEC xp_cmdshell &#39;mkdir c:\images&#39;;

-- list dir c:\images 
EXEC xp_cmdshell &#39;dir c:\images\*.*&#39;;
&lt;/pre&gt;
Store Procedure usp_lo_export
&lt;pre class=&quot;brush:sql&quot;&gt;
USE master; -- change to your database - mudar para o seu bd
GO
-- Creating Stored Procedure
-- start procedure 
IF EXISTS ( SELECT name FROM sys.objects  WHERE object_id = OBJECT_ID(N&#39;[dbo].[usp_lo_export]&#39;) AND type IN (N&#39;P&#39;) )
 DROP PROCEDURE usp_lo_export;
GO
CREATE PROCEDURE usp_lo_export (@bdx varchar(65), @schemax varchar(65), @tablex varchar(65), @col_bin_imgx varchar(65), @pk_tablex varchar(65), @idx bigint, @file_namex varchar(255))
AS
-- Artifact Name/Program...: usp_lo_exportx.sql
-- Author..................: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com)
-- Date Start..............: 28/08/2012
-- Date Update.............: 08/12/2014
-- Version.................: 0.03
-- Compiler/Interpreter....: T-SQL (Transact SQL) 
-- OS......................: Windows
-- RDBMS...................: MS SQL Server 2008/2012
-- Kernel..................: Not informed! 
-- Porpuse - Finalidade....: Stored Procedure to export images (varbinary) to binary file database for SO - SP para exportar imagens (varbinary) para arquivo binário do banco de dados para o SO 
-- Notice .................: The parameters are: db, schema, table name, column type binary, primary key, primary key id and name of the binary file -
-- ........................: Os parametros são: bd, esquema, nome da tabela, coluna do tipo binaria, chave primária, id da chave primaria e nome do arquivo binario
--  
BEGIN
 SET NOCOUNT ON
 BEGIN TRY
   
  DECLARE @sql_stmt varchar(4000)
        , @sql_query  varchar(4000) 
        , @v_sql      varchar(4)
        , @echo_v_sql varchar(255)
        , @dir_bcp varchar(255) 
 
  -- example of using bcp into SQL Server 2008 to form Bcp.fmt file (set in Y last option)
  -- exemplo de uso de bcp em SQL Server 2008, para formar archive bcp.fmt (setar Y na ultima opcao) 
  -- bcp testdb.dbo.uvw_img out c:\images\test1.png -T 
  -- bcp.fmt created - ja criado 
  -- bcp testdb.dbo.uvw_img out c:\images\test1.png -T -f c:\images\bcp.fmt     
 
  -- model fmt file bcp (bcp.fmt) to import binary, SQL SERVER 2008 
  -- modelo de arquivo fmt do bcp (bcp.fmt) para importação binaria, SQL SERVER 2008 
  --10.0
  --1
  --1       SQLBINARY           0       0       &quot;&quot;   1     archive            &quot;&quot;
     
 
  -- generating configuration file
  -- gerando arquivo de configuracao 
  SET @v_sql      = SUBSTRING(CAST (SERVERPROPERTY(&#39;productversion&#39;) AS VARCHAR(max)),1,4) -- version sql server 
  SET @echo_v_sql = &#39;ECHO &#39; + @v_sql + &#39; &gt; c:\images\conf_blob.fmt&#39;
    
  EXEC xp_cmdshell @echo_v_sql, no_output
  EXEC xp_cmdshell &#39;ECHO 1 &gt;&gt; c:\images\conf_blob.fmt&#39;, no_output
  EXEC xp_cmdshell &#39;ECHO 1       SQLBINARY           0       0       &quot;&quot;   1     archive            &quot;&quot; &gt;&gt; c:\images\conf_blob.fmt&#39;, no_output
 
  IF object_id(&#39;tempdb.dbo.##blobx&#39;) IS NOT NULL BEGIN
       DROP TABLE ##blobx
  END
  CREATE TABLE ##blobx
  (
       file_binx varbinary(max)
  )
   
  -- populating global temporary table with the table data, where the blob
  -- povoando tabela temporária global com os dados da tabela, onde se encontra o blob
  SET @sql_query = &#39;INSERT INTO tempdb.dbo.##blobx
                    SELECT &#39; + @col_bin_imgx  + &#39;
                      FROM &#39; + @bdx + &#39;.&#39; + @schemax + &#39;.&#39; + @tablex + &#39;
                     WHERE &#39; + @pk_tablex + &#39; = &#39; + ltrim(str(@idx)) 
  PRINT @sql_query
  EXEC (@sql_query)

            
  -- for use with dynamic sql xp_cmdshell SP - sql dinamico para uso com SP xp_cmdshell
  -- bcp tempdb.dbo.##blobx out c:\images\test1.png -T -f c:\images\bcp.fmt
  IF @v_sql = &#39;10.0&#39; BEGIN
       SET @dir_bcp = &#39;&quot;C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp&quot;&#39;
  END IF @v_sql = &#39;11.0&#39; BEGIN
       SET @dir_bcp = &#39;&quot;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\bcp&quot;&#39;
  END ELSE BEGIN
       SET @dir_bcp = &#39;bcp&#39;
  END
   
  SET @sql_stmt = @dir_bcp + &#39; tempdb.dbo.##blobx out c:\images\&#39; + ltrim(str(@idx)) + &#39;_&#39; + @file_namex + &#39; -T -f c:\images\conf_blob.fmt&#39;
 
  PRINT &#39;Exporting binary ...&#39;
  EXEC xp_cmdshell @sql_stmt, no_output
       
 END TRY
 
 BEGIN CATCH
  SELECT ERROR_NUMBER()  AS error_number
       , ERROR_SEVERITY()  AS error_severity
       , ERROR_STATE()  AS error_state
       , ERROR_PROCEDURE() AS error_procedure
       , ERROR_LINE()   AS error_line
       , ERROR_MESSAGE()  AS error_message;    
 END CATCH;
  
 -- cleaning dirt, eliminating temporary table - limpando sujeira, eliminando tabela temporaria
 IF object_id(&#39;tempdb.dbo.##blobx&#39;) IS NOT NULL BEGIN
      DROP TABLE ##blobx
 END 
 -- cleaning, eliminating the bcp format file - limpando sugeira, eliminando arquivo de formatacao do bcp 
 EXEC xp_cmdshell &#39;DEL c:\images\conf_blob.fmt&#39;, no_output
 
 SET NOCOUNT ON
END; 
GO 
-- end procedure 
&lt;/pre&gt;
Working with stored procedure usp_lo_export 
&lt;pre class=&quot;brush:sql&quot;&gt;
USE testdb; -- change to your database - mudar para o seu bd
GO

-- Creating Table Test
IF EXISTS ( SELECT name FROM sys.objects  WHERE object_id = OBJECT_ID(N&#39;[dbo].[image]&#39;) AND type IN (N&#39;U&#39;) )
 DROP TABLE image;
GO
CREATE TABLE image
(
   id_image int identity(1,1) NOT NULL  PRIMARY KEY
 , file_name nvarchar(1000) NOT NULL
 , archive varbinary(max) -- binary type, implemented in sql2005 sp2
);
GO

-- Only test - Apenas para teste
IF EXISTS ( SELECT name FROM sys.objects  WHERE object_id = OBJECT_ID(N&#39;[dbo].[uvw_img]&#39;) AND type IN (N&#39;V&#39;) )
 DROP VIEW uvw_img;
GO
CREATE VIEW uvw_img AS
SELECT TOP 1 archive FROM image
GO

-- If you need to test again - Caso precise fazer teste novamente
--TRUNCATE TABLE image;


-- Populating table with images - Povoando tabela com imagens
INSERT INTO image (file_name, archive) 
SELECT &#39;koala.jpg&#39;, BULKColumn FROM OPENROWSET(BULK N&#39;C:\Users\Public\Pictures\Sample Pictures\koala.jpg&#39;, SINGLE_BLOB) AS image;

INSERT INTO image (file_name, archive) 
SELECT &#39;desert.jpg&#39;, BULKColumn FROM OPENROWSET(BULK N&#39;C:\Users\Public\Pictures\Sample Pictures\desert.jpg&#39;, SINGLE_BLOB) AS image;

INSERT INTO image (file_name, archive) 
SELECT &#39;penguins.jpg&#39;, BULKColumn FROM OPENROWSET(BULK N&#39;C:\Users\Public\Pictures\Sample Pictures\penguins.jpg&#39;, SINGLE_BLOB) AS image;

INSERT INTO image (file_name, archive) 
SELECT &#39;plan_test.xlsx&#39;, BULKColumn FROM OPENROWSET(BULK N&#39;C:\Users\Public\Documents\plan_test.xlsx&#39;, SINGLE_BLOB) AS Image;
GO

-- Listing images
SELECT * FROM image;


-- Call the Store Procedure - Examples
-- Ex 01 - correct data reported
EXEC master.dbo.usp_lo_export &#39;testdb&#39;,&#39;dbo&#39;,&#39;image&#39;,&#39;archive&#39;,&#39;id_image&#39;,1,&#39;koala.jpg&#39;;
EXEC master.dbo.usp_lo_export &#39;testdb&#39;,&#39;dbo&#39;,&#39;image&#39;,&#39;archive&#39;,&#39;id_image&#39;,2,&#39;desert.jpg&#39;;
EXEC master.dbo.usp_lo_export &#39;testdb&#39;,&#39;dbo&#39;,&#39;image&#39;,&#39;archive&#39;,&#39;id_image&#39;,3,&#39;penguins.jpg&#39;;

SELECT * FROM image;

-- Ex 02 - Table wrongly informed - Tabela informada errada 
EXEC master.dbo.usp_lo_export &#39;testdb&#39;,&#39;dbo&#39;, &#39;imagex&#39;,&#39;archive&#39;,&#39;id_image&#39;,3,&#39;penguins.jpg&#39;;

-- Ex 03 - Correct data reported, electronically excel spreadsheet - Dados informados corretos, planilha eletronica do excel 
EXEC master.dbo.usp_lo_export &#39;testdb&#39;,&#39;dbo&#39;,&#39;image&#39;,&#39;archive&#39;,&#39;id_image&#39;,4,&#39;plan_excel.xlsx&#39;;

-- Ex 04 - Use with anonymous block - Uso com bloco anônimo 
DECLARE @file_namex varchar(255)
      , @idx bigint 
SET @idx = 1
SELECT @file_namex = file_name FROM image WHERE id_image = @idx
EXEC master.dbo.usp_lo_export &#39;testdb&#39;,&#39;dbo&#39;,&#39;image&#39;,&#39;archive&#39;,&#39;id_image&#39;, @idx, @file_namex; 
&lt;/pre&gt; 
The peace of the Lord Jesus</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/6606353800083962778/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2012/08/storing-and-retrieving-images-from-sql.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/6606353800083962778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/6606353800083962778'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2012/08/storing-and-retrieving-images-from-sql.html' title='Storing and Retrieving Images from SQL Server using Store Procedures in Transact-SQL - Armazenando e Recuperando Imagens do SQL Server usando Store Procedures em Transact-SQL'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK-hfKM9ms79maMMG8qVtKIS2U_7t3FqDH2cSFyyxW1QSPg0UOcd5BSqlcNWnFpxELV-mT3g6owJFlBLv1JdjNXY4S6Ok_w1Hol2mCWjFisEcnekTNkNvbHWhX4Zc0zy3f4p-yJxOuLEI/s72-c/Koala.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-599824600692999895</id><published>2012-08-03T12:35:00.000-03:00</published><updated>2012-08-03T13:21:36.760-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmos"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Algoritmos, Caixa Eletrônico em SQL SERVER</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigo6LU3-qph7x4m0MZ-RxCAXnP-4i0k4kE1gxGkpGKL08oqKMqTFd_np1pM4W267nLJ5_FJt8OI1SjcaweYbCQBFn5hZztNy6jOiP9SD88Lrt8sC7OAq2Dpg3kVa0fSTRFAS34d7AS0Sk/s1600/novas_cedulas_do_real.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear:right; float:right; margin-left:1em; margin-bottom:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;145&quot; width=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigo6LU3-qph7x4m0MZ-RxCAXnP-4i0k4kE1gxGkpGKL08oqKMqTFd_np1pM4W267nLJ5_FJt8OI1SjcaweYbCQBFn5hZztNy6jOiP9SD88Lrt8sC7OAq2Dpg3kVa0fSTRFAS34d7AS0Sk/s200/novas_cedulas_do_real.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Anteriormente em setembro/2010, havia escrito um script para caixa eletrônico em linguagem PL/PgSQL do Postgres, agora foi desenvolvido o mesmo algoritmo de caixa eletrônico para a linguagem Transact do SQL SERVER. &lt;/br&gt;
&lt;/br&gt;
O parâmetro é o valor em inteiro no qual retorna as cédulas das notas em Real. &lt;/br&gt;
&lt;/br&gt;
Com poucas adaptações, pode se remover a nota de 1 Real, para ficar com o novo padrão de cédulas da moeda Real do Brasil. &lt;/br&gt;
&lt;/br&gt;
Mais uma vez, espero ter ajudado. 
&lt;/br&gt;
&lt;/br&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;
--Retornando notas do caixa eletrônico
--Notas de 1, 2, 5, 10, 20, 50 e 100

IF EXISTS (
            SELECT * 
              FROM sys.objects 
             WHERE object_id = OBJECT_ID(N&#39;[dbo].[usf_caixa_eletro]&#39;) 
               AND type IN (N&#39;FN&#39;)
           )
 DROP FUNCTION usf_caixa_eletro;

CREATE FUNCTION usf_caixa_eletro (@pvalor int) RETURNS varchar(max) AS 
--
-- Nome Artefato/Programa..: usf_caixa_eletro_sql_server.sql
-- Autor(es)...............: O Peregrino (emersonhermann at gmail.com) 
-- Data Inicio ............: 02/08/2012
-- Data Atual..............: 03/08/2012
-- Versao..................: 0.01
-- Linguagem...............: TRANSACT 
-- Compilador/Interpretador: T-SQL 
-- Sistemas Operacionais...: Windows
-- SGBD....................: SQL SERVER 2005/2008/2012
-- Kernel..................: Nao informado!
-- Finalidade..............: Caixa Eletronico
-- OBS1....................: Caixa Eletronico
 
--
/*
Algoritmo Caixa Eletronico
notasSaída = []                         #guardar as notas que saírão do caixa eletrônico
notas = [100, 50, 20, 10, 5, 1]         #notas que podem ser sacadas
valor = 375                             #valor a ser sacado
 
restante = valor                        #faz uma cópia do valor em &quot;restante&quot;
inota = 0                               #índice da nota: 0 é 100, 1 é 50, 2 é 20, 3 é 10, ...
enquanto restante&gt;0:                    #enquanto restante for maior que 0
  resultado = restante-notas[inota]     #calcula o resultado da subtração entre o valor e a nota
  se resultado&lt;0:                       #se for negativo:
    inota++                             #incrementa o índice para a próxima nota
  senão:                                #se for positivo ou zero:
    restante = resultado                #deixa restante com o novo resultado
    notasSaída.adicionar(notas[inota])  #adiciona a nota utilizada nas que devem sair do caixa
 
para nota em notasSaída:                # escreve as notas que devem sair
  escreva nota
 
*/
BEGIN
 DECLARE
     @sretorno   varchar(max)
    ,@qnota1     integer
    ,@qnota2     integer
    ,@qnota5     integer
    ,@qnota10    integer
    ,@qnota20    integer
    ,@qnota50    integer
    ,@qnota100   integer
    ,@pvalorx    integer
    ,@residual   integer
    ,@restante   integer
    ,@vet_notas1 integer
    ,@vet_notas2 integer
    ,@vet_notas3 integer
    ,@vet_notas4 integer
    ,@vet_notas5 integer
    ,@vet_notas6 integer
    ,@vet_notas7 integer
    ,@i          integer
    ,@resultado  integer

    SET @vet_notas1=100
    SET @vet_notas2=50
    SET @vet_notas3=20
    SET @vet_notas4=10
    SET @vet_notas5=5
    SET @vet_notas6=2
    SET @vet_notas7=1
     
    SET @i         = 1
    SET @qnota1    = 0
    SET @qnota2    = 0
    SET @qnota5    = 0
    SET @qnota10   = 0
    SET @qnota20   = 0
    SET @qnota50   = 0
    SET @qnota100  = 0
    SET @pvalorx   = 0
    SET @resultado = 0
    SET @sretorno  = &#39;&#39;
    SET @restante  = @pvalor
 
    WHILE (@i &lt;= 7) BEGIN
     
    
        IF @i = 1 BEGIN 
            SET @resultado = @restante - @vet_notas1
        END ELSE IF @i = 2 BEGIN 
            SET @resultado = @restante - @vet_notas2 
        END ELSE IF @i = 3 BEGIN 
            SET @resultado = @restante - @vet_notas3
        END ELSE IF @i = 4 BEGIN 
            SET @resultado = @restante - @vet_notas4
        END ELSE IF @i = 5 BEGIN 
            SET @resultado = @restante - @vet_notas5
        END ELSE IF @i = 6 BEGIN 
            SET @resultado = @restante - @vet_notas6
        END ELSE IF @i = 7 BEGIN 
            SET @resultado = @restante - @vet_notas7
        END 

     
        IF (@resultado &lt; 0) BEGIN
          
           SET @i = @i + 1
               
        END ELSE BEGIN -- senao
 
           SET @restante = @resultado                             

           IF @i = 1 BEGIN
               SET @qnota100 = @qnota100 + 1
           END ELSE IF @i = 2 BEGIN
               SET @qnota50 = @qnota50 + 1
           END ELSE IF @i = 3 BEGIN
               SET @qnota20 = @qnota20 + 1
           END ELSE IF @i = 4 BEGIN
               SET @qnota10 = @qnota10 + 1
           END ELSE IF @i = 5 BEGIN
               SET @qnota5  = @qnota5 + 1
           END ELSE IF @i = 6 BEGIN
               SET @qnota2  = @qnota2 + 1
           END ELSE IF @i = 7 BEGIN
               SET @qnota1  = @qnota1 + 1
           END --fim_se 
              
        END -- fim_se 
  
    END -- fim_enquanto
     
     
    SET @sretorno = &#39;Total: &#39;
                 + cast (@pvalor as varchar(max))
                 + &#39; &#39; --chr(10)
                 + &#39;Notas de 100:&#39;
                 + cast (@qnota100 as varchar(max))
                 + &#39; &#39; --chr(10)
                 + &#39;Notas de 50:&#39;
                 + cast (@qnota50 as varchar(max))
                 + &#39; &#39; --chr(10)
                 + &#39;Notas de 20:&#39;
                 + cast (@qnota20 as varchar(max))
                 + &#39; &#39; --chr(10)
                 + &#39;Notas de 10:&#39;
                 + cast (@qnota10 as varchar(max))
                 + &#39; &#39; --chr(10)
                 + &#39;Notas de 5:&#39;
                 + cast (@qnota5 as varchar(max)) 
                 + &#39; &#39; --chr(10)
                 + &#39;Notas de 2:&#39;
                 + cast (@qnota2 as varchar(max))
                 + &#39; &#39; --chr(10)
                 + &#39;Notas de 1:&#39;
                 + cast (@qnota1 as varchar(max))
                 
    RETURN (@sretorno) -- Retorna as linhas
END;
GO
 
--alguns testes, chamada da function
 
--SELECT dbo.usf_caixa_eletro(2678);
--SELECT dbo.usf_caixa_eletro(1078); 
&lt;/pre&gt;&lt;/br&gt;</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/599824600692999895/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2012/08/algoritmos-caixa-eletronico-em-sql.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/599824600692999895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/599824600692999895'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2012/08/algoritmos-caixa-eletronico-em-sql.html' title='Algoritmos, Caixa Eletrônico em SQL SERVER'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigo6LU3-qph7x4m0MZ-RxCAXnP-4i0k4kE1gxGkpGKL08oqKMqTFd_np1pM4W267nLJ5_FJt8OI1SjcaweYbCQBFn5hZztNy6jOiP9SD88Lrt8sC7OAq2Dpg3kVa0fSTRFAS34d7AS0Sk/s72-c/novas_cedulas_do_real.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-3639171804839181653</id><published>2012-06-29T12:15:00.000-03:00</published><updated>2012-06-29T14:53:16.214-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>DECODE ZERO NO SQL SERVER</title><content type='html'>&lt;br&gt;

Segue um script para simular uso da função DECODE do SGBDR Oracle, nesta function, adaptei para situação em que o valor for zero, &lt;br&gt;
por exemplo uma situação em que tem que dividir um valor por zero. &lt;br&gt;&lt;br&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;
IF EXISTS (
            SELECT * 
              FROM sys.objects 
             WHERE object_id = OBJECT_ID(N&#39;[dbo].[usf_decode_zero]&#39;) 
               AND type IN (N&#39;FN&#39;)
           )
   DROP FUNCTION usf_decode_zero;
  
GO

CREATE FUNCTION usf_decode_zero(@param1 float, @param2 float) RETURNS float AS
-- Nome Artefato/Programa..: usf_decode_zero.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com) 
-- Data Inicio ............: 28/06/2012
-- Data Atualizacao........: 28/06/2012
-- Versao..................: 0.01
-- Compilador/Interpretador: T-SQL (Transact SQL) 
-- Sistemas Operacionais...: Windows
-- SGBD....................: MS SQL Server 2005/2008
-- Kernel..................: Nao informado!
-- Finalidade..............: Store Procedure (Function)  verifica se o valor do primeiro parametro é igual a zero, retornando o valor do 
-- ........................:  segundo parametro2, semalhante a função decode do Oracle, porém simplificado.
-- OBS.....................: O primeiro parametro é um float, retorna o valor do segundo parametro que também é flaot, caso o primeiro 
-- ........................:  parametro seja igual a zero, caso contrário retorna o valor do primeiro parametro.
-- ........................: 
--  
BEGIN
    RETURN 
      (

   SELECT CASE WHEN @param1 = 0 THEN 
        @param2 
      ELSE 
        @param1
       END AS usf_decode_zero
   ) 

END;
GO
-- exemplo do uso da function 
SELECT dbo.usf_decode_zero (0,1200);     --Retorno: 1200
SELECT dbo.usf_decode_zero (1100,1);     --Retorno: 1100
SELECT dbo.usf_decode_zero (NULL,1);     --Retorno: NULL

-- exemplo tratando, o erro de divisão por zero, Mensagem 8134 (CLÁSSICA)
SELECT 2400/dbo.usf_decode_zero(0,1);    --Retorno: 2400
SELECT 2400/dbo.usf_decode_zero(2400,1); --Retorno: 1
SELECT 2400/dbo.usf_decode_zero(NULL,1); --Retorno: NULL


&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/3639171804839181653/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2012/06/deocode-zero-no-sql-server.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/3639171804839181653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/3639171804839181653'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2012/06/deocode-zero-no-sql-server.html' title='DECODE ZERO NO SQL SERVER'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-9159796644372193974</id><published>2012-04-20T15:27:00.001-03:00</published><updated>2012-04-23T14:48:20.335-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Como alterar o COLLATION de um BD no SQL Server 2005 ou 2008</title><content type='html'>Esse artigo se propõe a ensinar como alterar os collations de todos os bancos de dados de uma instancia SQL Server 2005/2008, inclusive tabelas e campos.&lt;br /&gt;
&lt;br /&gt;
As vezes ou quase sempre não é possível executar o comando abaixo e mesmo que execute será necessário mudar os colations das tabelas e colunas:&lt;br /&gt;
--ALTER DATABASE nome_banco COLLATE Latin1_General_CI_AI;&lt;br /&gt;
&lt;br /&gt;
Outro problema é que se os collations estiverem errados nos campos, dependendo da aplicação as consultas irão gerar resultados inesperados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY3UZTqCg0c2ZgeJpjVZqBjc4qgrAVCoW-WsggySGvNsSSQ6O2W6DcO2X021gSVLIi6exNcek7DfCmy45hWq_kudIz0po87g0bsWI1QhTB-E2FogI5eB2o4mbrVT5hQmOT30QknGzFfLU/s1600/collation_errado.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;350&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY3UZTqCg0c2ZgeJpjVZqBjc4qgrAVCoW-WsggySGvNsSSQ6O2W6DcO2X021gSVLIi6exNcek7DfCmy45hWq_kudIz0po87g0bsWI1QhTB-E2FogI5eB2o4mbrVT5hQmOT30QknGzFfLU/s400/collation_errado.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i style=&quot;text-align: -webkit-auto;&quot;&gt;Figura 01 - Listando os Collations dos Bancos de Dados&lt;/i&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
Foi observado que caso o collation que queira se mudar seja igual ao do master será necessário informar outro collation diferente para que haja mudança total 
e depois informar novamente o collation que se deseja.&lt;br /&gt;
&lt;br /&gt;
Por exemplo:&lt;br /&gt;
&lt;br /&gt;
Se deseja mudar o collation para Latin1_General_CI_AI, mas o BD master está com o mesmo collation e o BD do usuário está com outro collation a mudança não será possível, então será necessário mudar o collation do BD master por exemplo: Latin1_General_CI_AS para depois mudar novamente Latin1_General_CI_AI.&lt;br /&gt;
&lt;br /&gt;
Observar também que será necessário que o BD do usuário esteja na pasta padrão data do SQL Server. 

Exemplo de onde fica a pasta data do SQL Server 2008 com nome da instancia MSSQLSERVER (padrão) na pasta:&lt;br /&gt;
&amp;nbsp;C:\Arquivos de Programas\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\data.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimHOgW1L2im9QBSezH16oM55J2scJBfkC6PPBB45kGbqmq7Vup6d7K7iAAZZm5S8xZpF92_esL6BHeeh5yJ7uCUqtGcgtYWnARnnXVKoniAzvXUOFD8dKT1_0cw0nKVgVMM43YMUWdOFw/s1600/pasta_data.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;285&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimHOgW1L2im9QBSezH16oM55J2scJBfkC6PPBB45kGbqmq7Vup6d7K7iAAZZm5S8xZpF92_esL6BHeeh5yJ7uCUqtGcgtYWnARnnXVKoniAzvXUOFD8dKT1_0cw0nKVgVMM43YMUWdOFw/s400/pasta_data.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;Figura 02 - Pasta DATA padrão do MS SQL SERVER 2008&amp;nbsp;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
Neste caso o procedimento para mudança do collation se faz necessário parar a instancia &amp;nbsp;do SQL SERVER, &amp;nbsp;mas para isso por segurança vamos parar todos os serviços do SQL SERVER, neste caso usei a forma nativa do mesmo, &amp;nbsp;pelo Sql Server Configuration Manager, em Iniciar-&amp;gt;Executar digite:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;SQLServerManager10.msc&lt;/pre&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG3JnqMV0ZH-YUGIZr_uBvPzLC5KjGP-C6brE6Cvab04WzQeHaFAb-CxB4TsA1yGU4bEaogTW08bGRXltCCAhOZpoG2N83gYNCwg9-dZO1nO5oLuJWGcXPLktMO8Sw3PW0zq8U_FD1a28/s1600/sql_server_todo_parado.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;138&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG3JnqMV0ZH-YUGIZr_uBvPzLC5KjGP-C6brE6Cvab04WzQeHaFAb-CxB4TsA1yGU4bEaogTW08bGRXltCCAhOZpoG2N83gYNCwg9-dZO1nO5oLuJWGcXPLktMO8Sw3PW0zq8U_FD1a28/s320/sql_server_todo_parado.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;Figura 03 - Parando Todos os Serviços do MS-SQL Server&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo do comando a ser executado em uma instancia com MS-SQL SERVER 2008 ou em Inicar-&amp;gt;Executar&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn\sqlservr -m -sMSSQLSERVER -T4022 -T3659 -q&quot;Latin1_General_CI_AI&quot;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0I1e1iJH5li3Um-UtZml9r2tN0KHPFAuQmtOQ3pQHI464UhcksOg2bjVt-A30K0EbmXsew3pmbbKfaCqmS7H5d4WZEyHklo1dO41s7uSkRPpGoxaJpKxsNTabqt_c5VIsVdhRTkURAJQ/s1600/executando_instancia_sql_server_com_mudanca_collation.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;221&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0I1e1iJH5li3Um-UtZml9r2tN0KHPFAuQmtOQ3pQHI464UhcksOg2bjVt-A30K0EbmXsew3pmbbKfaCqmS7H5d4WZEyHklo1dO41s7uSkRPpGoxaJpKxsNTabqt_c5VIsVdhRTkURAJQ/s400/executando_instancia_sql_server_com_mudanca_collation.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;Figura 04 - Comando Executado para Mudança de Collation em Iniciar-&amp;gt;Executar&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS34BThRNOiqbxFoybSUI9t-rWxWsPgYgBra8KUTFJ5FjSC67KgoOmzfZrHdSpRpdocD_h-Ny4fkh4al6sA4jwFHhbhR8k1AWfEzEmvuVIDspdoLUxIe-cMmr2sR41priFukCKMdozimc/s1600/recovery_is_complete_executando.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;203&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS34BThRNOiqbxFoybSUI9t-rWxWsPgYgBra8KUTFJ5FjSC67KgoOmzfZrHdSpRpdocD_h-Ny4fkh4al6sA4jwFHhbhR8k1AWfEzEmvuVIDspdoLUxIe-cMmr2sR41priFukCKMdozimc/s400/recovery_is_complete_executando.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;Figura 05 - Mudança de Collation sendo Processada&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ5-GXmwkbOYorBoDZkIjH3l4cTzL60tmrVTxG43OCUxn-hWGxRqTh0cNRGMqBsOPqz59peidm3I9pPdWR7OIk7pthln86rCk2gtJDmGLQL4Z-vhzeR6z7QvI7FrlE1pgXws0CQsfOOG8/s1600/recovery_is_complete.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;203&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ5-GXmwkbOYorBoDZkIjH3l4cTzL60tmrVTxG43OCUxn-hWGxRqTh0cNRGMqBsOPqz59peidm3I9pPdWR7OIk7pthln86rCk2gtJDmGLQL4Z-vhzeR6z7QvI7FrlE1pgXws0CQsfOOG8/s400/recovery_is_complete.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;Figura 06 - Final do Processo de Mudança de Collation, Pressionar Y&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
Outro ponto a observar é que em casos que o BD do usuário tenha algum problema do tipo corrupção, mesmo que ainda não esteja no nível de SUSPECT será necessário dá um DBCC CHECKDB (&#39;NomeBanco&#39;,repair_allow_data_loss); e em casos mais extremos, isto é paginação com problemas, usar DBCC UPDATEUSAGE (NomeBanco); depois de corrigidos os problemas no BD, repetir o processo de conversão de collation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTzJnc4GGW2ZqYEGc1NaDhh12XGTDkobDlMWgxlVAgPY1npwNSM_9pz1aXK60Un062EktOKNImn2KwNkqaYoByf-bbyodr9LMvEb9iTmsdAhtaa5sTBRhLPrAqZBXPaovlGu0fZEAbdb8/s1600/recovery_is_complete_error.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;203&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTzJnc4GGW2ZqYEGc1NaDhh12XGTDkobDlMWgxlVAgPY1npwNSM_9pz1aXK60Un062EktOKNImn2KwNkqaYoByf-bbyodr9LMvEb9iTmsdAhtaa5sTBRhLPrAqZBXPaovlGu0fZEAbdb8/s400/recovery_is_complete_error.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;Figura 07 - Erro na Conversão do Collation por Motivo de BD com Problemas&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzVwBeqdsclprjLfSfGq1WwLpUlWxOjfvNQWLrTYca7wETdT5y5OLKOfvh_VKTEKQkhgIjbhJcIoQcrGQSKFFTAAx-bskm_QUTFjHW8P6DPJHv4pD0UeapdvJw7lq8hWYU9NVaHxBM65U/s1600/dbcc.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzVwBeqdsclprjLfSfGq1WwLpUlWxOjfvNQWLrTYca7wETdT5y5OLKOfvh_VKTEKQkhgIjbhJcIoQcrGQSKFFTAAx-bskm_QUTFjHW8P6DPJHv4pD0UeapdvJw7lq8hWYU9NVaHxBM65U/s400/dbcc.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;Figura 08 - Executando reparação de erros no BD&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Depois de concluido com sucesso a conversão do collation, iniciar o serviço do SQL SERVER pelo Sql Server Configuration Manager, em Iniciar-&amp;gt;Executar digite:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;SQLServerManager10.msc&lt;/pre&gt;
&lt;br /&gt;
Para verificar as mudanças efetuadas, liste os collations dos Bancos de Dados, conforme Figura 01.&lt;br /&gt;
&lt;br /&gt;
Uma outra dica é desatachar os bancos de dados do ReportServer, caso não deseje também mudar o collation do mesmo, &lt;br /&gt;
lembrar de parar o serviço do ReportServer antes de desatachar esses bancos.&lt;br /&gt;
&lt;br /&gt;
Segue script abaixo:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;-- 0. Caso haja problemas de corrupção, mas ainda não está no nível de suspect com o Banco de Dados, será necessário executar os procedimentos elencados, se não pule essa parte.
ALTER DATABASE NomeBanco SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
DBCC CHECKDB (&#39;NomeBanco&#39;,repair_allow_data_loss);
DBCC UPDATEUSAGE (NomeBanco);
ALTER DATABASE NomeBanco SET MULTI_USER WITH ROLLBACK IMMEDIATE; 

-- 1. Listar os tipos de collations Latin1_General%
SELECT * 
  FROM ::fn_helpcollations()
 WHERE name LIKE &#39;Latin1_General%&#39;
  
-- 2. Listar os bancos com os seus respectivos collations (via query) 
SELECT getdate();
SELECT collation_name
     , * 
  FROM sys.databases 
 WHERE name LIKE &#39;%nome_banco%&#39;;

-- 3. Listar os bancos com os seus respectivos collations (via store procedure) 
sp_helpdb; 

/* 
-- 4. Parar o serviço do MS-SQL SERVER em Configuration&amp;nbsp;Manager&amp;nbsp;ou usando o comando direto (sqlservermanager10.msc) ou usando services.msc 

-- 5. Rodar esse comando no prompt de comando (cmd.exe), ao executar esse comando o MS-SQL entrar em modo single user mode e altera todos os collations 
-- de todos os bancos, tabelas e campos, neste caso altera o &quot;Nome_Instancia_MSSQL&quot; e o &quot;Nome_Collation&quot; para o adequando nesse caso para Latin1_General_CI_AI

sqlservr -m -sNome_Instancia_MSSQL -T4022 -T3659 -q&quot;Nome_Collation&quot;

-- 6. Exemplo do comando a ser executado em uma instancia com MS-SQL SERVER 2005 ou em Inicar-&amp;gt;Executar
C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlservr -m -sMSSQL -T4022 -T3659 -q&quot;Latin1_General_CI_AI&quot;

-- ou se a instancia que estiver com nome diferente 
C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlservr -m -sMSSQL.1 -T4022 -T3659 -q&quot;Latin1_General_CI_AI&quot;

-- ou pelo prompt do cmd já pasta binn informada acima digitar:
sqlservr -m -sMSSQL.1 -T4022 -T3659 -q&quot;Latin1_General_CI_AI&quot;


-- 7. Exemplo do comando a ser executado em uma instancia com MS-SQL SERVER 2008 ou em Inicar-&amp;gt;Executar
C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn\sqlservr -m -sMSSQLSERVER -T4022 -T3659 -q&quot;Latin1_General_CI_AI&quot;

-- ou pelo prompt do cmd já pasta binn informada acima digitar:

sqlservr -m -sMSSQLSERVER -T4022 -T3659 -q&quot;Latin1_General_CI_AI&quot;


-- 8. Quando concluir encerrar, isto é, depois que aparacer a seguinte mensagem: 
-- The default collation wa successfully changed. 
-- Recovery is complete. This is an informational message only. No user action is required.
-- Pressionar CTRL + C e depois iniciar o serviço do MS-SQL SERVER (vê item 4, inciando o serviço)

-- Caso não consiga exito executar o comando DBCC CHECKDB, pois deve ter alguma corrupção no BD.
-- 9. Depois conferir se os collations dos bancos mudaram inclusive master, tempdb, msdb (vê item 3 ou item 2 mudando o nome do banco)

*/
&lt;/pre&gt;
&lt;br /&gt;
Vale salientar que esse procedimento, não é documentado pela Microsoft, mas a conversão funciona no MS SQL Server 2005 e 2008 sem nenhum problema.&lt;br /&gt;
&lt;br /&gt;
Mais uma vez... espero ter ajudado...</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/9159796644372193974/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2012/04/como-alterar-o-collation-de-um-bd-no.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/9159796644372193974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/9159796644372193974'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2012/04/como-alterar-o-collation-de-um-bd-no.html' title='Como alterar o COLLATION de um BD no SQL Server 2005 ou 2008'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY3UZTqCg0c2ZgeJpjVZqBjc4qgrAVCoW-WsggySGvNsSSQ6O2W6DcO2X021gSVLIi6exNcek7DfCmy45hWq_kudIz0po87g0bsWI1QhTB-E2FogI5eB2o4mbrVT5hQmOT30QknGzFfLU/s72-c/collation_errado.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-7828278082578272380</id><published>2012-04-03T13:09:00.000-03:00</published><updated>2012-04-13T02:16:25.175-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Shrink MSSQL Server 2005 e 2008</title><content type='html'>Objetivo deste artigo tem com principio a orientação de como proceder redução de LOG e BD no MSSQL SERVER 2005 e 2008.
&lt;/br&gt;
&lt;/br&gt;
Lembro também que execução de SHRINK, impossibilita a recuperação do BD, caso ocorra alguma suspeita de corrupção do banco de 
dados (SUSPECT), todavia é recomendável configurar plano de manutenção, evitando assim muitas problemas.
&lt;/br&gt;
&lt;/br&gt;
Recomenda-se backup full antes de executar os scripts abaixo: 
&lt;/br&gt;
&lt;/br&gt;
No MSSQL SERVER 2005 para MDF e LDF
&lt;br&gt;
&lt;/br&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;

--SHIRINK SQL SERVER 2005, formato 1, SHIRINK DE LDF e MDF 
--Alterar o [nome_banco] para seu banco de dados 
USE [nome_banco]; 
GO
BACKUP LOG [nome_banco] WITH TRUNCATE_ONLY;
GO
DBCC SHRINKDATABASE([nome_banco], 10, TRUNCATEONLY);
&lt;/pre&gt;
&lt;/br&gt;
&lt;/br&gt;
No MSSQL SERVER 2008 para MDF e LDF
&lt;br&gt;

&lt;pre class=&quot;brush:sql&quot;&gt;
--SHIRINK SQL SERVER 2008, formato 1, se tiver como recovery_mode full, SHIRINK DE LDF e MDF 
--Lista bancos com os modos de recuperação 
SELECT name, recovery_model, recovery_model_desc, state_desc, collation_name, user_access_desc, create_date 
FROM sys.databases;
GO

--Alterar o [nome_banco] para seu banco de dados 
USE [nome_banco]; 
GO

BACKUP LOG [nome_banco] TO DISK = &#39;NUL:&#39;;
GO

DBCC SHRINKDATABASE([nome_banco], 10, TRUNCATEONLY);
GO
&lt;/pre&gt;

&lt;/br&gt;
Truncando apenas o LOG (LDF) MS SQL SERVER 2005 
&lt;/br&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;

--SHIRINK SQL SERVER 2005, formato 2, SHIRINK DE LOG 
--Alterar o [nome_banco] para seu banco de dados 
USE [nome_banco];
GO

BACKUP LOG [nome_banco] WITH TRUNCATE_ONLY;
GO

DECLARE @log_file_logical_name sysname;
SELECT @log_file_logical_name=name FROM sys.database_files d WHERE type = 1;
PRINT @log_file_logical_name;

DBCC SHRINKFILE (@log_file_logical_name, 1);
GO


&lt;/pre&gt;
&lt;/br&gt;
Truncando apenas o LOG (LDF) MS SQL SERVER 2008
&lt;/br&gt;

&lt;pre class=&quot;brush:sql&quot;&gt;
--SHIRINK SQL SERVER 2008, formato 2, SHIRINK DE LOG 
--USANDO RECOVERY SIMPLE, isto é, desabilitando o LOG detalhado 
--Alterar o [nome_banco] para seu banco de dados 
SELECT name, recovery_model, recovery_model_desc, state_desc, collation_name, user_access_desc, create_date FROM sys.databases;
GO

USE [nome_banco];
GO
ALTER DATABASE [nome_banco] SET RECOVERY SIMPLE; 
GO

DECLARE @log_file_logical_name sysname;
SELECT @log_file_logical_name=name FROM sys.database_files d WHERE type = 1;
PRINT @log_file_logical_name;

DBCC SHRINKFILE (@log_file_logical_name, 1);
GO

-- Retornando para recovery_model para full 
ALTER DATABASE [nome_banco] SET RECOVERY FULL ; 
&lt;/pre&gt;
&lt;/br&gt;
&lt;/br&gt;
Espero ter ajudado! 

&lt;/br&gt;</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/7828278082578272380/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2012/04/shrink-mssql-server-2005-e-2008.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/7828278082578272380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/7828278082578272380'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2012/04/shrink-mssql-server-2005-e-2008.html' title='Shrink MSSQL Server 2005 e 2008'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-2315954990504994276</id><published>2012-03-29T17:02:00.001-03:00</published><updated>2012-04-16T13:50:26.184-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Store Function SQL Server para validar CHAVE de NFE</title><content type='html'>Store Function SQL Server para validar CHAVE de NFE 
&lt;/br&gt;
&lt;/br&gt;

Store function para validar CHAVE de NFE em SQL do MSSQL SERVER 2005 e 2008.
&lt;/br&gt;
Essa function serve para validar Nota Fiscal Eletrônica, a entrada de parametro é um varchar &lt;/br&gt;
retorna 1 para CHAVE de NFE válida e 0 para CHAVE de NFE inválida e NULL quanto for NULO.&lt;/br&gt;
&lt;/br&gt;
&lt;/br&gt;

Segue a function....

&lt;/br&gt;
&lt;/br&gt;

&lt;pre class=&quot;brush:sql&quot;&gt;

IF EXISTS (
            SELECT * 
              FROM sys.objects 
             WHERE object_id = OBJECT_ID(N&#39;[dbo].[usf_calcula_dv_nfe]&#39;) 
               AND type IN (N&#39;FN&#39;)
           )
   DROP FUNCTION usf_calcula_dv_nfe;
 
GO
  
CREATE FUNCTION usf_calcula_dv_nfe(@number varchar(max)) RETURNS bit
-- Nome Artefato/Programa..: usf_calcula_dv_nfe.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com) 
-- Data Inicio ............: 29/03/2012
-- Data Atualizacao........: 29/03/2012
-- Versao..................: 0.01
-- Compilador/Interpretador: T-SQL (Transact SQL) 
-- Sistemas Operacionais...: Windows
-- SGBD....................: MS SQL Server 2005/2008
-- Kernel..................: Nao informado!
-- Finalidade..............: Store Procedure (Function)  que calcula o digito verificador da chave de acesso NFe usando o modulo 11
-- OBS.....................: A entrada é um varchar e o retorno é um  bit 1 para valido e 0 para invalido 
-- ........................: 
--  
AS
BEGIN
 DECLARE @i       int,
         @ix      int, 
         @c       int,
         @keyx    int,
         @numberx varchar(44), 
         @r       int
 
      
 SET @c    = 2
 SET @i    = 1
 SET @ix   = 43 
 SET @keyx = 0 
 
 -- Pre-validacao 1, se e nulo, entao retorna nulo
 IF @number IS NULL BEGIN
    SET @r = NULL
    RETURN (@r)  
 END --fim_se      
 
 -- Pre-validacao 2, se e maior que 44 digitos , entao retorna 0 
 IF LEN(@number) &lt; 44 BEGIN
    SET @r = 0 
    RETURN (@r)
 END --fim_se
 
 -- Pre-validacao 3, se e tem alguma letra, entao retorna 0 
 IF (SELECT CASE WHEN patindex(&#39;%[^0-9]%&#39;, @number) &gt; 0 THEN 1 ELSE 0 END) = 1 BEGIN
    SET @r = 0
    RETURN (@r)
 END --fim_se  
 
 -- Pre-validacao 4, se e menor que 44 digitos , pode ser oriundo de bigint, então fazer tratamento de zeros 
 SET @numberx = @number
 IF LEN(@number) &lt; 44 BEGIN
    SET @numberx = REPLICATE(&#39;0&#39;,44-LEN(@number))+@number
 END --fim se
  
 -- Loop por cada numero mutiplicando-o pelos valores de @c
 -- Simulando o for invertido com passo -1 
 WHILE (@i &lt;= (len(@numberx)-1)) BEGIN 
   
    --Verifica se o valor de @c for maior que nove, entao passa o valor pra 2
    IF @c &gt; 9 BEGIN
       SET @c = 2
    END --fim_se

    --Soma os valores mutiplicados
    SET @keyx = @keyx + (convert(int,substring(@number,@ix,1)) * @c) 
  
    --Controle de contadores
    SET @c = @c + 1
    SET @i = @i + 1 
    SET @ix = @ix - 1 
 
 END  --fim_enquanto 
  
 --Obtem o digito verificador
 IF ((@keyx % 11) = 0 OR (@keyx % 11) = 1) BEGIN
    SET @r = 0
 END ELSE BEGIN --senao   
    SET @r  = 11 - (@keyx % 11)
 END --fim_se
  
 IF @r = convert(int,substring(@numberx,len(@numberx),1)) BEGIN
    SET @r = 1 
 END ELSE BEGIN  --senao   
    SET @r = 0       
 END --fim_se
  
 RETURN (@r)
 
END;
GO
-- Chamada da function 

SELECT dbo.usf_calcula_dv_nfe(&#39;24110509540525000194550010000007091242050760&#39;);
SELECT dbo.usf_calcula_dv_nfe(&#39;24110509540525000194550010000007071681710981&#39;);

-- Habilitando no campo da CHAVE de NFE (chave_nfe)
/*
ALTER TABLE nota_fiscal_eletronica
  ADD CONSTRAINT ck_nota_fiscal_eletronica_usf_calcula_dv_nfe 
CHECK (dbo.usf_calcula_dv_nfe(chave_nfe)=1); 
*/ 
GO

&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/2315954990504994276/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2012/03/store-function-sql-server-para-validar.html#comment-form' title='7 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/2315954990504994276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/2315954990504994276'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2012/03/store-function-sql-server-para-validar.html' title='Store Function SQL Server para validar CHAVE de NFE'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-3429977623356378201</id><published>2012-03-27T19:00:00.000-03:00</published><updated>2012-03-29T17:21:14.492-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Formatar CPF em SQL</title><content type='html'>Store function para formatar CPF em SQL Server 
&lt;/br&gt;
&lt;/br&gt;


&lt;pre class=&quot;brush:sql&quot;&gt;
IF EXISTS (
            SELECT * 
              FROM sys.objects 
             WHERE object_id = OBJECT_ID(N&#39;[dbo].[usf_formata_cpf]&#39;) 
               AND type IN (N&#39;FN&#39;)
           )
 DROP FUNCTION dbo.usf_formata_cpf;
GO

CREATE FUNCTION dbo.usf_formata_cpf(@cpf varchar(max), @mascara bit) RETURNS varchar(max) 
AS
-- Nome Artefato/Programa..: usf_formata_cpf.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com) 
-- Data Inicio ............: 21/02/2012
-- Data Atualizacao........: 21/02/2012
-- Versao..................: 0.01
-- Compilador/Interpretador: T-SQL (Transact SQL) 
-- Sistemas Operacionais...: Windows
-- SGBD....................: MS SQL Server 2005/2008
-- Kernel..................: Nao informado!
-- Finalidade..............: Store Procedure (Function) para mascara o numero do CPF
-- OBS.....................: A entrada é um varchar e o retorno é um varchar formatado do cpf, parametro mascara setado em 0 apenas string com zeros, 1 formata o cpf de fato 
-- ........................: 
--  
BEGIN

  DECLARE @cpf_temp varchar(max) 
  
  -- Pre-validacao 1, se e nulo, entao retorna nulo
  IF @cpf IS NULL BEGIN
     RETURN (@cpf)  
  END --fim_se      

  -- Pre-validacao 2, se e diferente de 11 digitos , entao retorna 0 
  IF LEN(@cpf) &gt; 11 BEGIN
     RETURN (@cpf)
  END --fim_se
  
  -- Pre-validacao 3, se e tem alguma letra no cpf, entao retorna 0 
  IF (SELECT CASE WHEN patindex(&#39;%[^0-9]%&#39;, @cpf) &gt; 0 THEN 1 ELSE 0 END) = 1 BEGIN
     RETURN (@cpf)
  END --fim_se  

  -- Pre-validacao 4, se e menor que 11 dig, pode ser oriundo de um bigint, entao colocar zeros a frente
  SET @cpf_temp = @cpf 
  IF LEN(@cpf) &lt; 11 BEGIN
     SET @cpf_temp = REPLICATE(&#39;0&#39;,11-LEN(@cpf))+@cpf
  END --fim_se 
  
  -- Se e para formatar mesmo 
  IF @mascara = 1 BEGIN
     SET @cpf_temp = SUBSTRING(@cpf_temp,1,3) + &#39;.&#39; + SUBSTRING(@cpf_temp,4,3) + &#39;.&#39; + SUBSTRING(@cpf_temp,7,3) + &#39;-&#39; + SUBSTRING(@cpf_temp,10,2) 
  END --fim_se 
  
  RETURN (@cpf_temp) 
  
END;
GO

-- chamada da function 

--SELECT dbo.usf_formata_cpf(&#39;481604472z&#39;,0);
--SELECT dbo.usf_formata_cpf(&#39;0541371479&#39;,1);
--SELECT dbo.usf_formata_cpf(&#39;05413714793&#39;,1);
--SELECT dbo.usf_formata_cpf(18404,1);
--SELECT dbo.usf_formata_cpf(18404,0);

&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/3429977623356378201/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2012/03/formatar-cpf-em-sql.html#comment-form' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/3429977623356378201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/3429977623356378201'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2012/03/formatar-cpf-em-sql.html' title='Formatar CPF em SQL'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-8536919235210680115</id><published>2012-03-27T00:45:00.000-03:00</published><updated>2012-03-29T17:22:47.822-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Validar CPF em SQL</title><content type='html'>Como validar CPF em SQL Server, store function para validar CPF em T-SQL. 
&lt;/br&gt;
&lt;/br&gt;
Esta store function, foi desenvolvida pensando no armazenamento do CPF em BIGINT, mas pode ser usada facilmente sem adaptações com CPF tipo VARCHAR(11) sem mascaras ou formatações.&lt;/br&gt;
&lt;/br&gt;
Recomendável persistência do CPF em BIGINT por motivo principal de desempenho. &lt;/br&gt;
&lt;/br&gt;
Segue function.... &lt;/br&gt;
&lt;/br&gt;

&lt;pre class=&quot;brush:sql&quot;&gt;



IF EXISTS (
            SELECT * 
              FROM sys.objects 
             WHERE object_id = OBJECT_ID(N&#39;[dbo].[usf_valida_cpf]&#39;) 
               AND type IN (N&#39;FN&#39;)
           )
 DROP FUNCTION dbo.usf_valida_cpf;
GO

CREATE FUNCTION dbo.usf_valida_cpf(@cpf varchar(max)) RETURNS bit 
AS
-- Nome Artefato/Programa..: usf_valida_cpf.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com) baseado em Script feito por:
-- ........................: Cristiano Martins Alves em http://www.devmedia.com.br
-- Data Inicio ............: 19/05/2011
-- Data Atualizacao........: 21/02/2012
-- Versao..................: 0.02
-- Compilador/Interpretador: T-SQL (Transact SQL) 
-- Sistemas Operacionais...: Windows
-- SGBD....................: MS SQL Server 2005/2008
-- Kernel..................: Nao informado!
-- Finalidade..............: Store Procedure (Function) para validar o numero do CPF
-- OBS.....................: A entrada é um varchar e o retorno é um bit, 1 para válido, 0 para inválido e null para nulos 
-- ........................: 
--  
BEGIN
  DECLARE @index   int,
          @sumx    int,
          @dig1    int,
          @dig2    int,
          @cpf_temp   varchar(11),
          @cpfx             varchar(11), 
          @dig_equal  bit,  --0 para negativa e 1 para afirmativa
          @r    bit

  -- Pre-validacao 1, se e nulo, entao retorna nulo
  IF @cpf IS NULL BEGIN
     SET @r = NULL
     RETURN (@r)  
  END --fim_se      

  -- Pre-validacao 2, se e maior que 11 digitos , entao retorna 0 
  IF LEN(@cpf) &gt; 11 BEGIN
     SET @r = 0 
     RETURN (@r)
  END --fim_se
  
  
  -- Pre-validacao 3, se e tem alguma letra no cpf, entao retorna 0 
  IF (SELECT CASE WHEN patindex(&#39;%[^0-9]%&#39;, @cpf) &gt; 0 THEN 1 ELSE 0 END) = 1 BEGIN
     SET @r = 0
     RETURN (@r)
  END --fim_se  
  
  -- Pre-validacao 4, se e menor que 11 digitos , pode ser oriundo de bigint, então fazer tratamento de zeros 
  SET @cpfx = @cpf
  IF LEN(@cpf) &lt; 11 BEGIN
     SET @cpfx = REPLICATE(&#39;0&#39;,11-LEN(@cpf))+@cpf
  END --fim se
   
  /*
  -- Pre-validcao 5, se a sequencia tem numeros iguais, entao retorna 0 
     Verificando se os digitos sao iguais.
     A Principio CPF com todos os numeros iguais sao invalidos,
      apesar de validar o calculo do digito verificador
     EX: O CPF 00000000000 é inválido, mas pelo calculo seria valido
  */

  SET @cpf_temp = SUBSTRING(@cpfx,1,1)

  SET @index = 1
  SET @dig_equal = 1

  WHILE (@index &lt;= 11) BEGIN
     IF SUBSTRING(@cpfx,@index,1) &lt;&gt; @cpf_temp BEGIN
        SET @dig_equal = 0
     END 
     SET @index = @index + 1
  END;

  --Caso os digitos nao sejam todos iguais, comeca o calculo dos digitos
  IF @dig_equal = 0 BEGIN

     --Calculo do 1º digito
     SET @sumx = 0
     SET @index = 1
     
     WHILE (@index &lt;= 9) BEGIN   
        SET @sumx = @sumx + CONVERT(int,SUBSTRING(@cpfx,@index,1)) * (11 - @index)       
        SET @index = @index + 1      
     END

     SET @dig1 = 11 - (@sumx % 11)

     IF @dig1 &gt; 9 BEGIN     
        SET @dig1 = 0       
     END 

     -- Calculo do 2º digito
     SET @sumx = 0
     SET @index = 1
     
     WHILE (@index &lt;= 10) BEGIN   
        SET @sumx = @sumx + CONVERT(int,SUBSTRING(@cpfx,@index,1)) * (12 - @index)     
        SET @index = @index + 1 
     END  --fim_enquanto 

     SET @dig2 = 11 - (@sumx % 11)

     IF @dig2 &gt; 9 BEGIN    
        SET @dig2 = 0     
     END 

     -- Validando
     IF (@dig1 = SUBSTRING(@cpfx,LEN(@cpfx)-1,1)) AND (@dig2 = SUBSTRING(@cpfx,LEN(@cpfx),1)) BEGIN
        SET @r = 1 
     END ELSE BEGIN  --senao   
       SET @r = 0       
     END --fim_se
     
  END ELSE BEGIN --senao 

     SET @r = 0  -- invalido
    
  END --fim_se
  
  RETURN (@r) 
  
END;
GO

-- chamada da function 

--SELECT dbo.usf_valida_cpf(&#39;80481604472&#39;);  -- retorna 1
-- ou 
--SELECT dbo.usf_valida_cpf(80481604472); -- retorna 1 
-- ou 
--SELECT dbo.usf_valida_cpf(&#39;05413714793&#39;); -- retorna 1
-- ou 
--SELECT dbo.usf_valida_cpf(05413714793); -- retorna 1



&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/8536919235210680115/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2012/03/validar-cpf-em-sql.html#comment-form' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/8536919235210680115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/8536919235210680115'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2012/03/validar-cpf-em-sql.html' title='Validar CPF em SQL'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-6487096231748629128</id><published>2012-03-12T23:27:00.000-03:00</published><updated>2012-08-23T14:45:41.679-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Validando Cadastro Específico do INSS - CEI em SQL Server</title><content type='html'>Validando Cadastro Específico do INSS - CEI em SQL Server, como validar CEI em SQL Server usando functions do TRANSACT SQL
&lt;pre class=&quot;brush:sql&quot;&gt;
-- Nome Artefato/Programa..: usf_valida_cei.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com) 
-- Data Inicio ............: 11/03/2012
-- Data Atualizacao........: 11/03/2012
-- Versao..................: 0.01
-- Compilador/Interpretador: T-SQL (Transact SQL) 
-- Sistemas Operacionais...: Windows
-- SGBD....................: MS SQL Server 2005/2008
-- Kernel..................: Nao informado!
-- Finalidade..............: Store Procedure (Function) para validar numero de CEI (Cadastro Especifico de INSS) 
-- OBS.....................: A entrada é um varchar e o retorno é um bit, 1 para válido, 0 para inválido e null para nulos 
-- ........................: 
--
IF EXISTS (
            SELECT * 
              FROM sys.objects 
             WHERE object_id = OBJECT_ID(N&#39;[dbo].[usf_valida_cei]&#39;) 
               AND type IN (N&#39;FN&#39;)
           )
 DROP FUNCTION usf_valida_cei;
GO
CREATE FUNCTION  usf_valida_cei(@number varchar(max)) RETURNS bit AS
/*
CEI - Cadastro Específico do INSS 
O algorítmo abaixo demonstra como obter o dígito verificador da matricula CEI.
Formato : EE.NNN.NNNNN/AD
Onde:
EE - Número
NNNNNNNN - Número
A - Atividade
D - Dígito Verificador
a) Multiplicar os últimos 11 algarismos pelos seus respectivos pesos, conforme abaixo:
Pesos: 7,4,1,8,5,2,1,6,3,7,4
Algarismos: EENNNNNNNNA

Cálculo
7 * E = X1
4 * E = X2
1 * N = X3
8 * N = X4
5 * N = X5
2 * N = X6
1 * N = X7
6 * N = X8
3 * N = X9
7 * N = X10
4 * A = X11
D (posição do dígito)


b) Somar todos os produtos obtidos no item &quot;a&quot;

Soma = X1+2+X3+X4+X5+X6+X7+X8+X9+X10+X11

c) Com o total obtido no item &quot;b&quot;, somar o algarismo da unidade com o algarismo da dezena.

Total = Dezena de soma + Unidade de soma

d) Subtrair de 10 o algarismo da unidade do obtido no item &quot;c&quot;.

Resultado = 10 - Unidade de Total

O algarismo da unidade do resultado da subtração será o dígito verificador.

Digito verificador = Unidade de Resultado
*/  

BEGIN


 DECLARE @weight   varchar (11)
 DECLARE @total   int
 DECLARE @c    int
 DECLARE @result   int
 DECLARE @r    bit
 DECLARE @number_dig  int
 DECLARE @number_dig_c int
 DECLARE @number_dig_x varchar(2) 

 SET @weight = &#39;74185216374&#39;  -- peso estabelecido para gerar CEI 
 SET @total = 0 
 SET @c  = 1  
 SET @number_dig = substring(@number,len(@number),1) -- ultimo digito extraido do parametro informado

 --fazendo um uma pre-validação do CEI, validação 1 se é nulo
 IF @number IS NULL BEGIN
  SET @r = NULL
  RETURN (@r) 
 END --fim_se   

 --fazendo um uma pre-validação do CEI, validação 2 se o tamanho é diferente de 12 digitos 
 IF LEN(@number) &gt; 12  BEGIN
  SET @r = 0
  RETURN (@r)
 END  --fim_se

 --fazendo um uma pre-validação do CEI, validação 3 se não for nulo e for mair que 12,
 -- ainda pode ser uma string 
 IF (SELECT CASE WHEN patindex(&#39;%[^0-9]%&#39;, @number) &gt; 0 THEN 1 ELSE 0 END) = 1 BEGIN
  SET @r = 0
  RETURN (@r)
 END --fim_se   

 --fazendo um uma pre-validação do CEI, validação 4 se está vindo c/ 12 dig zerados
 IF CAST(@number AS bigint)=0 BEGIN
  SET @r = 0
  RETURN (@r)
 END  --fim_se  


 WHILE (@c&lt;=11) BEGIN
  SET @result = cast (substring(@number, @c, 1) AS int) * cast(substring(@weight,@c, 1) AS int) 
  SET @total  = @total + @result
  SET @c = @c + 1 
 END -- fim_enquanto, neste caso, while simulando for 

 SET @number_dig_x = right(left(cast (@total as varchar(max)), 12), 2)
 SET @number_dig_c = (cast(left(@number_dig_x, 1) as int)) + (cast(right(@number_dig_x, 1) as int))
 SET @number_dig_c = 10 - (cast (Right(Left(@number_dig_c, 12), 1) as int))


 IF (@number_dig_c &gt; 9) BEGIN
  SET @number_dig_c = 0
 END ELSE BEGIN 
  SET @number_dig_c = 10 - @number_dig_c
 END 

 IF (@number_dig &lt;&gt; @number_dig_c) BEGIN 
  SET @r = 0
 END ELSE BEGIN
  SET @r = 1 
 END 
    
 RETURN (@r)

END;
GO
-- Exemplo de chamada da function 
-- SELECT dbo.usf_valida_cei(&#39;741852163748&#39;);
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/6487096231748629128/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2012/03/validando-cadastro-especifico-do-inss.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/6487096231748629128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/6487096231748629128'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2012/03/validando-cadastro-especifico-do-inss.html' title='Validando Cadastro Específico do INSS - CEI em SQL Server'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-7108410107935587456</id><published>2012-02-20T02:03:00.000-03:00</published><updated>2012-02-21T00:09:23.916-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Função para validar NIT PIS PASEP em MS SQL Server 2005 / 2008</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRmJ5eqyTRaVorpmlCdRNakWmVB4UaXk68B2QF6Mjw4LRkZXCpnS8hznWd8csf2cHC7g9j1oxyfG1vgxlRmk6Hg-TPGAwOoHxsGWFm6nsLVnHrWAcTDmIJZ8HD6e7Dn85QDkZ8uVF4Ne4/s1600/cartao_cidadao.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear:right; float:right; margin-left:1em; margin-bottom:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;135&quot; width=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRmJ5eqyTRaVorpmlCdRNakWmVB4UaXk68B2QF6Mjw4LRkZXCpnS8hznWd8csf2cHC7g9j1oxyfG1vgxlRmk6Hg-TPGAwOoHxsGWFm6nsLVnHrWAcTDmIJZ8HD6e7Dn85QDkZ8uVF4Ne4/s200/cartao_cidadao.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;/br&gt;
&lt;/br&gt;
Como não encontrei nada na net, para validar NIT PIS PASEP em MS SQL Server 2005 / 2008, e diante da necessidade, verificando o algoritmo para validação do NIT PIS PASEP, resolvi desenvolver uma função em T-SQL para validar esse troço.
&lt;/br&gt;
&lt;/br&gt;
Na verdade só testei com o MS SQL Server 2008, não tive tempo de testar no 2005, mas acho que deva funcionar em ambas. Fica por conta e risco nas dua versões. 
&lt;/br&gt;
&lt;/br&gt;
O moído é o seguinte: 
&lt;/br&gt;
&lt;/br&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;
-- Nome Artefato/Programa..: usf_valida_nit_pis_pasep.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com) 
-- Data Inicio ............: 19/02/2012
-- Data Atualizacao........: 21/02/2012
-- Versao..................: 0.02
-- Compilador/Interpretador: T-SQL (Transact SQL) 
-- Sistemas Operacionais...: Windows
-- SGBD....................: MS SQL Server 2005/2008
-- Kernel..................: Nao informado!
-- Finalidade..............: Store Procedure (Function) para validar numero de NIT PIS PASEP
-- OBS.....................: A entrada é um varchar e o retorno é um bit, 1 para válido, 0 para inválido e null para nulos 
-- ........................: 
--
IF EXISTS (
            SELECT * 
              FROM sys.objects 
             WHERE object_id = OBJECT_ID(N&#39;[dbo].[usf_valida_nit_pis_pasep]&#39;) 
               AND type IN (N&#39;FN&#39;)
           )
 DROP FUNCTION usf_valida_nit_pis_pasep;
GO

CREATE FUNCTION usf_valida_nit_pis_pasep(@number varchar(max)) RETURNS bit AS
BEGIN
 DECLARE @weight  varchar (10)
 DECLARE @total  int
 DECLARE @c   int
 DECLARE @rest       int
 DECLARE @result  int
 DECLARE @r   bit 
 /*
 FORMATO : NNNNNNNNNND 
 ONDE:
 NNNNNNNNN - Numero do Identificador
 D   - Digito Verificador

 a) Multiplicar os 11 ultimos algarismos pelos pesos conforme descrito abaixo:
 PESOS:  3, 2, 9, 8, 7, 6, 5, 4, 3, 2
 ALGORISMO: NNNNNNNNN  
 CALCULO:  
 3 * N = X1
 2 * N = X2
 9 * N = X3
 8 * N = X4
 7 * N = X5
 6 * N = X6
 5 * N = X7
 4 * N = X8
 3 * N = X9
 2 * N = X10
 D (posicao do digito)
 */

 SET @weight = &#39;3298765432&#39;  -- peso estabelecido para gerar NIT PIS PASEP 
 SET @total = 0 
 SET @c  = 1 
    
 --fazendo um uma pre-validação do NIT PIS PASEP, validação 1 se é nulo
 IF @number IS NULL BEGIN
     SET @r = NULL
     RETURN (@r)  
 END 

 --fazendo um uma pre-validação do PIS PASEP, validação 2 se o tamanho é diferente de 11 digitos 
 IF LEN(@number) &lt;&gt; 11  BEGIN
     SET @r = 0
     RETURN (@r)
 END  --fim_se
    
 --fazendo um uma pre-validação do PIS PASEP, validação 3 se não for nulo e for mair que 11, ainda pode ser uma string 
 IF (SELECT CASE WHEN patindex(&#39;%[^0-9]%&#39;, @number) &gt; 0 THEN 1 ELSE 0 END) = 1 BEGIN 
     SET @r = 0
     RETURN (@r)
 END --fim_se 
    
 --fazendo um uma pre-validação do PIS PASEP, validação 4 se está vindo c/ 11 dig zerados
 IF CAST(@number AS bigint)=0 BEGIN
     SET @r = 0
     RETURN (@r)
 END  --fim_se
    
 /*
 b) Somar todos os produtos obtidos no item &quot;a&quot;. 
 SOMA = X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8 + X9 + X10
 */

 WHILE (@c&lt;=10) BEGIN
     SET @result = CAST (SUBSTRING(@number, @c, 1) AS INT) * CAST(SUBSTRING(@weight,@c, 1) AS INT) 
     SET @total  = @total + @result
     SET @c = @c + 1 
 END -- fim_enquanto, neste caso, while simulando for 
 
 /*
 c) Dividir o somatório do item &quot;b&quot; por 11.
 DIVISAO = SOMA / 11    
 */ 
 -- dividindo, não é necessário, já vai ser feito direto no resto da divisao, apenas para acompanhar o algoritmo 
 SET @result = @total / 11 
 -- calculando resto da divisao
 SET @rest = @total % 11
 
 /*
 d) Subtrair de 11 o resto da divisao do item &quot;c&quot;.
 RESULTADO = 11 - RESTO_DA_DIVISAO
 
 O resultado sera o digito verificador. 
 Caso o resultado da subtracao seja 10 ou 11, o digito verificador sera 0.    
 */

 SET @rest = 11 - @rest

 IF @rest = 10 OR @rest = 11 BEGIN
     SET @rest = 0 
 END --fim_se
  
 IF (@rest &lt;&gt; CAST (SUBSTRING(@number, 11, 1) AS INT)) BEGIN
     SET @r = 0  -- numero invalido
 END ELSE BEGIN
     SET @r = 1  -- numero valido 
 END --fim_se
    
 RETURN (@r)
    
END; 
GO

-- Fazendo chamada da function, exemplo:

SELECT dbo.usf_valida_nit_pis_pasep(&#39;12511508690&#39;); -- retorna 1 pois é valido 
GO

-- Checando na tabela colaborador todos os NITs inválidos no campo nit, exemplo:

SELECT * 
  FROM colaborador 
 WHERE dbo.usf_valida_nit_pis_pasep(nit)=1;
GO

-- Pode se ainda implementar direto na tabela colaborador para validar o campo nit, por exemplo:

ALTER TABLE colaborador
  ADD CONSTRAINT ck_colaborador_usf_valida_nit_pis_pasep 
CHECK (dbo.usf_valida_nit_pis_pasep(nit)=1); 

GO
&lt;/pre&gt;



Mais uma vez, espero ter ajudado! 
&lt;/br&gt;
O Peregrino.</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/7108410107935587456/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2012/02/funcao-para-validar-nit-pis-pasep-em-ms.html#comment-form' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/7108410107935587456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/7108410107935587456'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2012/02/funcao-para-validar-nit-pis-pasep-em-ms.html' title='Função para validar NIT PIS PASEP em MS SQL Server 2005 / 2008'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRmJ5eqyTRaVorpmlCdRNakWmVB4UaXk68B2QF6Mjw4LRkZXCpnS8hznWd8csf2cHC7g9j1oxyfG1vgxlRmk6Hg-TPGAwOoHxsGWFm6nsLVnHrWAcTDmIJZ8HD6e7Dn85QDkZ8uVF4Ne4/s72-c/cartao_cidadao.jpg" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1954476673957285943.post-7580258617207044361</id><published>2011-12-02T00:49:00.018-03:00</published><updated>2011-12-04T06:36:48.105-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Outros"/><title type='text'>Configurando SyntaxHighlighter no Blogspot, ou usando cores para sintaxe de linguagens e scripts no seu Blogger</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifwXNFimfCslB3DnBMNO7ukPC7Ph8TQ3ZFYJltAFf2fSWistHSfD7S7rDfdmgadqyKgOUyNkzAaxu6PzJ_uE_RVaJoxzLp6E3xkJYy7IotpmcwL4m9J03kZ1P2OtFScvxu4aOnzNdIFug/s1600/SyntaxHighlighter.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;72&quot; width=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifwXNFimfCslB3DnBMNO7ukPC7Ph8TQ3ZFYJltAFf2fSWistHSfD7S7rDfdmgadqyKgOUyNkzAaxu6PzJ_uE_RVaJoxzLp6E3xkJYy7IotpmcwL4m9J03kZ1P2OtFScvxu4aOnzNdIFug/s320/SyntaxHighlighter.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Configurando SyntaxHighlighter no Blogspot, ou usando cores para sintaxe de linguagens e scripts no seu Blogger.&lt;br /&gt;
&lt;br /&gt;
Uma das coisas legais para quem é blogueiro principalmente com o Blogger da Google é você usar scripts com cores dos &lt;br /&gt;
comandos destacados, principamente linguagens e scripts.&lt;br /&gt;
&lt;br /&gt;
Esse artigo se propõe a ensinar a dica de como configurar isso no Blogger (Blogspot) da Google, para tal usamos um artefato, framework, chamado &lt;br /&gt;
SyntaxHighlighter em &lt;a href=&quot;http://alexgorbatchev.com/SyntaxHighlighter/&quot;&gt;http://alexgorbatchev.com/SyntaxHighlighter/&lt;/a&gt; desenvolvido em JavaScript por Alex Gorbatchev&lt;br /&gt;
&lt;br /&gt;
Aqui vai o passo a passo para configurar o SyntaxHighlighter no seu blog da Blogger.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizvb1XvtZjgV2cTskGHqrc0i1CFucCHpxqORJjFSeXdvztfWOvDrjfML7zDPV5TKxhNH1NhJtgzMxbAYWSH424tXh70V7MB3kef8oEjAeGGR19r85QgfKUs4bpXFJMJQUhscwXRblSDjE/s1600/Blogger_Logo40.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:right; float:right; margin-left:1em; margin-bottom:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;40&quot; width=&quot;150&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizvb1XvtZjgV2cTskGHqrc0i1CFucCHpxqORJjFSeXdvztfWOvDrjfML7zDPV5TKxhNH1NhJtgzMxbAYWSH424tXh70V7MB3kef8oEjAeGGR19r85QgfKUs4bpXFJMJQUhscwXRblSDjE/s200/Blogger_Logo40.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No seu Blogspot ou Blogger da Google, acesse a guia [Design] clicar no item [Editar HTML]&lt;br /&gt;
&lt;br /&gt;
Por segurança clicar no item [Baixar modelo completo] antes de fazer qualquer alteração no modelo.&lt;br /&gt;
&lt;br /&gt;
Já com uma cópia do seu template feito, acesse o campo [Editar Modelo], e encontre o texto &amp;lt;/head&gt; tag de fechamento. &lt;br /&gt;
Antes dessa tag, adicione o seguinte:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;!-- inicio configuracao do Syntax Highlighting --&gt;
&amp;lt;link href=&#39;http://alexgorbatchev.com/pub/sh/current/styles/shCore.css&#39; rel=&#39;stylesheet&#39; type=&#39;text/css&#39;/&gt;
&amp;lt;!-- configuracao do tema, css usado, default, branco, inicio --&gt;
&amp;lt;link href=&#39;http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css&#39; rel=&#39;stylesheet&#39; type=&#39;text/css&#39;/&gt;
&amp;lt;!-- configuracao do tema, css usado, default, branco, fim --&gt;
&amp;lt;script src=&#39;http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js&#39; type=&#39;text/javascript&#39;/&gt;

&amp;lt;!-- adicionando Script para SyntaxHighlighter --&gt; 
&amp;lt;script type=&#39;text/javascript&#39;&gt;
  SyntaxHighlighter.config.bloggerMode = true;
  SyntaxHighlighter.all();
&amp;lt;/script&gt;

&amp;lt;!-- configuracao de linguagens usadas, inicio --&gt;
&amp;lt;script src=&#39;http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js&#39; type=&#39;text/javascript&#39;/&gt;
&amp;lt;script src=&#39;http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js&#39; type=&#39;text/javascript&#39;/&gt;
&amp;lt;script src=&#39;http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js&#39; type=&#39;text/javascript&#39;/&gt;
&amp;lt;script src=&#39;http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js&#39; type=&#39;text/javascript&#39;/&gt;
&amp;lt;script src=&#39;http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js&#39; type=&#39;text/javascript&#39;/&gt;
&amp;lt;script src=&#39;http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js&#39; type=&#39;text/javascript&#39;/&gt;
&amp;lt;script src=&#39;http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js&#39; type=&#39;text/javascript&#39;/&gt;
&amp;lt;script src=&#39;http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js&#39; type=&#39;text/javascript&#39;/&gt;
&amp;lt;script src=&#39;http://alexgorbatchev.com/pub/sh/current/scripts/shBrushDelphi.js&#39; type=&#39;text/javascript&#39;/&gt;
&amp;lt;script src=&#39;http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js&#39; type=&#39;text/javascript&#39;/&gt;
&amp;lt;script src=&#39;http://alexgorbatchev.com/pub/sh/current/scripts/shBrushDiff.js&#39; type=&#39;text/javascript&#39;/&gt;
&amp;lt;script src=&#39;http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js&#39; type=&#39;text/javascript&#39;/&gt;
&amp;lt;!-- configuracao de linguagens usadas, fim --&gt;

&amp;lt;!-- fim configuracao do Syntax Highlighting --&gt;
&lt;/pre&gt;&lt;br /&gt;
Um breve comentário do que foi adicionado ao modelo original ...&lt;br /&gt;
&lt;br /&gt;
A partir do comentário [&amp;lt;!-- configuracao do tema, css usado, default, branco, inicio --&gt;] &lt;br /&gt;
Nesse caso é o tema padrão (default) branco, mas tem vários temas a ser visto no site do SyntaxHighlighter em &lt;a href=&quot;http://alexgorbatchev.com/SyntaxHighlighter/manual/themes/&quot;&gt;http://alexgorbatchev.com/SyntaxHighlighter/manual/themes/&lt;/a&gt;&lt;br /&gt;
No meu blog eu o uso um tema cinza preto, estilo console do linux, no qual seria este: &lt;br /&gt;
&amp;lt;link href=&#39;http://alexgorbatchev.com/pub/sh/current/styles/shThemeFadeToGrey.css&#39;/&gt;&lt;br /&gt;
&lt;br /&gt;
A partir do comentário [&amp;lt;!-- configuracao de linguagens usadas, inicio --&gt;]&lt;br /&gt;
Adicione as linguagens que você planeja usar, no seu blog.&lt;br /&gt;
&lt;br /&gt;
Por exemplo, estou habilitando as seguintes linguagens ou scripts (brushes ou escovas):&lt;br /&gt;
JavaScript, Bash, SQL, XML/HTML, C++, Java, PHP, Perl, Delphi, Plain, Diff, Vb.&lt;br /&gt;
&lt;br /&gt;
Salve o seu modelo modificado, clicando em [SALVAR MODELO].&lt;br /&gt;
&lt;br /&gt;
Agora você está habilitado para adicionar destaque de sintaxe para o seu blog. &lt;br /&gt;
Envolva seu código em uma tag &amp;lt;pre&gt; e especifique a classe brush, utilizando o atributo de classe a linguagem ou script.&lt;br /&gt;
Por exemplo, para destacar um bloco de SQL: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&quot;brush:sql&quot;&gt; &lt;br /&gt;
&lt;br /&gt;
SELECT * &lt;br /&gt;
FROM usuario&lt;br /&gt;
WHERE id_usuario = 777;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Veja como aparece, quando formatado usando o SyntaxHighlighter:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;SELECT * 
   FROM usuario
  WHERE id_usuario = 777;
 
&lt;/pre&gt;&lt;br /&gt;
O código que você está formatando deve ser HTML, já que o framework foi desenvolvido em JavaScript.&lt;br /&gt;
&lt;br /&gt;
Espero ter ajudado, APSJ!</content><link rel='replies' type='application/atom+xml' href='http://emersonhermann.blogspot.com/feeds/7580258617207044361/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://emersonhermann.blogspot.com/2011/12/configurando-syntaxhighlighter-no_02.html#comment-form' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/7580258617207044361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1954476673957285943/posts/default/7580258617207044361'/><link rel='alternate' type='text/html' href='http://emersonhermann.blogspot.com/2011/12/configurando-syntaxhighlighter-no_02.html' title='Configurando SyntaxHighlighter no Blogspot, ou usando cores para sintaxe de linguagens e scripts no seu Blogger'/><author><name>O Peregrino</name><uri>http://www.blogger.com/profile/16611685451148516212</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2ekIZuEzEYsvk-90YnROhnGBnUAFfwojxzE7EYQkwCRe_6JaXbt6Wc6IZjybekcVmHbN6NVBtDjp3J86FqxIxpBAUGM_33OkTHDogTVorVSBxmnBDh73f6g3VGYNlWw/s220/Emerson_Hermann_44_anos.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifwXNFimfCslB3DnBMNO7ukPC7Ph8TQ3ZFYJltAFf2fSWistHSfD7S7rDfdmgadqyKgOUyNkzAaxu6PzJ_uE_RVaJoxzLp6E3xkJYy7IotpmcwL4m9J03kZ1P2OtFScvxu4aOnzNdIFug/s72-c/SyntaxHighlighter.png" height="72" width="72"/><thr:total>4</thr:total><georss:featurename>Natal - RN, Brasil</georss:featurename><georss:point>-5.7944784999999994 -35.210953099999983</georss:point><georss:box>-5.892986 -35.28087859999998 -5.6959709999999992 -35.141027599999987</georss:box></entry></feed>