1+ /* #info
2+
3+ # Autor
4+ Rodrigo Ribeiro Gomes
5+ (adaptado de Fausto F. Branco em http://dba-sqlserver.blogspot.com.br/2009/11/gerar-cpf-valido.html)
6+
7+ # Descricao
8+ View para gerars CPFs.
9+ Você pode fazer um cross apply com e gerar um cpf por linha.
10+ O script original usava estrutruas de loops, o que deixava difícil para adaptar em comandos SELECT ou lento (se usado como uma table function).
11+ Portando para uma view, você pode facilmente usar em diversos lugares e manter o máximo de performance.
12+
13+ Exemplo:
14+
15+ select
16+ *
17+ from
18+ FakeUsers
19+ CROSS JOIN
20+ vwGeraCPF
21+
22+ Esse comando acima vai gerar um cpf para cada linha da tabela FakeUsers.
23+ */
24+
25+ USE master
26+ GO
27+
28+ IF OBJECT_ID (' dbo.vwGerarCPF' ,' V' ) IS NOT NULL
29+ EXEC (' CREATE VIEW dbo.vwGerarCPF as select 1' )
30+ GO
31+
32+ ALTER VIEW dbo .vwGeraCPF
33+ AS
34+
35+
36+
37+ SELECT
38+ cpf = convert (varchar (1 ),n1)+
39+ convert (varchar (1 ),n2)+
40+ convert (varchar (1 ),n3)+
41+ convert (varchar (1 ),n4)+
42+ convert (varchar (1 ),n5)+
43+ convert (varchar (1 ),n6)+
44+ convert (varchar (1 ),n7)+
45+ convert (varchar (1 ),n8)+
46+ convert (varchar (1 ),n9)+
47+ convert (varchar (1 ),d1)+
48+ convert (varchar (1 ),d2)
49+ FROM
50+ (
51+ SELECT
52+ C2BASE.*
53+ ,d2 = CASE
54+ WHEN d2calc%11 < 2 THEN 0
55+ ELSE 11 - d2calc%11
56+ END
57+
58+ FROM (
59+ SELECT
60+ C1.*
61+ ,d2calc = d1* 2 + n9* 3 + n8* 4 + n7* 5 + n6* 6 + n5* 7 + n4* 8 + n3* 9 + n2* 10 + n1* 11
62+ FROM
63+ (
64+
65+ SELECT
66+ CASE
67+ WHEN d1calc%11 < 2 THEN 0
68+ ELSE 11 - d1calc%11
69+ END as d1
70+ ,C1BASE.*
71+ FROM
72+ (
73+ SELECT
74+ *
75+ ,d1calc = (n9* 2 + n8* 3 + n7* 4 + n6* 5 + n5* 6 + n4* 7 + n3* 8 + n2* 9 + n1* 10 )%11
76+ FROM
77+ (
78+ SELECT
79+ convert (int ,1000 * RAND (CHECKSUM (NEWID ())))%9 as n1
80+ ,convert (int ,1000 * RAND (CHECKSUM (NEWID ())))%9 as n2
81+ ,convert (int ,1000 * RAND (CHECKSUM (NEWID ())))%9 as n3
82+ ,convert (int ,1000 * RAND (CHECKSUM (NEWID ())))%9 as n4
83+ ,convert (int ,1000 * RAND (CHECKSUM (NEWID ())))%9 as n5
84+ ,convert (int ,1000 * RAND (CHECKSUM (NEWID ())))%9 as n6
85+ ,convert (int ,1000 * RAND (CHECKSUM (NEWID ())))%9 as n7
86+ ,convert (int ,1000 * RAND (CHECKSUM (NEWID ())))%9 as n8
87+ ,convert (int ,1000 * RAND (CHECKSUM (NEWID ())))%9 as n9
88+ ) R
89+ ) C1BASE
90+ ) C1
91+ ) C2BASE
92+ ) C2
93+
94+
0 commit comments