Usuário com melhor resposta
identar query de forma dinamica

Pergunta
-
preciso criar uma forma dinamica de identar uma query. a a query seria passada comoa parâmetro numa proc, por exemplo...
eu precisaria identificar o que é comando do sql e identar. por exemplo:
select
coluan1,
coluan2
from
tabela
where
1 = 1
outro exemplo:
update
tabela
set
coluan1 = valor
where
1 = 1
outro exemplo:
delete
tabela
where
1 = 1
e assim por diante...vejam que os comandos do sql estão "identados" (com quebra de linha).
é possível?
Respostas
-
Rafa,
Segue uma procedure:
CREATE
PROCEDURE dbo.IdentarQueryPorEspaco(@Var VARCHAR(8000))
AS
BEGIN
DECLARE
@TabelaFinal TABLE
(
Codigo
VARCHAR(8000)
)
WHILE
(LEN(@Var) > 1)
BEGIN
IF(CHARINDEX(' ', @Var) > 0)
BEGIN
INSERT INTO @TabelaFinal(Codigo) SELECT SUBSTRING(@Var, 0, CHARINDEX(' ', @Var))
SET @Var = SUBSTRING(@Var, CHARINDEX(' ', @Var) + 1, 80000)
END
ELSE
BEGIN
INSERT INTO @TabelaFinal(Codigo) SELECT SUBSTRING(@Var, 0, 8000)
SET @Var = ''
END
END
SELECT
LTRIM(RTRIM(Codigo)) As Codigo
FROM
@TabelaFinal
END
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
ITIL V3 Foundation
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com- Marcado como Resposta rafa-martin sexta-feira, 22 de fevereiro de 2013 18:24
Todas as Respostas
-
-
-
Rafa,
Segue uma procedure:
CREATE
PROCEDURE dbo.IdentarQueryPorEspaco(@Var VARCHAR(8000))
AS
BEGIN
DECLARE
@TabelaFinal TABLE
(
Codigo
VARCHAR(8000)
)
WHILE
(LEN(@Var) > 1)
BEGIN
IF(CHARINDEX(' ', @Var) > 0)
BEGIN
INSERT INTO @TabelaFinal(Codigo) SELECT SUBSTRING(@Var, 0, CHARINDEX(' ', @Var))
SET @Var = SUBSTRING(@Var, CHARINDEX(' ', @Var) + 1, 80000)
END
ELSE
BEGIN
INSERT INTO @TabelaFinal(Codigo) SELECT SUBSTRING(@Var, 0, 8000)
SET @Var = ''
END
END
SELECT
LTRIM(RTRIM(Codigo)) As Codigo
FROM
@TabelaFinal
END
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
ITIL V3 Foundation
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com- Marcado como Resposta rafa-martin sexta-feira, 22 de fevereiro de 2013 18:24
-
Retorno:
SELECT
TOP
1
'Fabrizzio'
As
Nome,
'21'
As
IdadeExecução:
dbo.IdentarQueryPorEspaco
@Var
=
'
SELECT TOP 1 ''Fabrizzio'' As Nome, ''21'' As Idade
'
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
ITIL V3 Foundation
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com -
fabrizzio para o update não rola. seu eu passar uma query como essa set @Var = 'update tabela set coluna1 = ''valor'', coluna2 = 0', o resultado será:
update
tabela
set
coluna1
=
'1',
coluna2
=
'0'veja que está quebrando o sinal de igual e também o valor que deve atualizado no campo. teria q ser assim, para o update:
update
tabela
set
coluna1 = 'valor',
coluna2 = '0' -
Rafa,
Sinceramente não acho que isso seja possivel de forma simples, e a partir dai é melhor partir para um .net ou algo assim. Veja que a partir desta sua ultima postagem não existe mais regra. Algumas que pensei mas não servem:
- Aspas simples, pode ser um inteiro sem as aspas;
- Contagem de espaço, não serve pois o valor passado por ter N espaços;
- Seu numero de colunas pode ser dinamico;
Enfim, tudo pode ser feito, mas como o SQL ja não é para este proposito, acho que é melhor partir para soluções alternativas.
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
ITIL V3 Foundation
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com