Array
(
)

Ajuda com Join p/ relatorio

Darcio Junior,
|
MVP
    23 mai 2012

Olá estou com um problema para montar uma query para gerar um relatório, preciso que a query me gere o seguinte:
Nome das colunas,tipo de dado,se é nulo ou não,se possui default ou não.
Quero que ele faça isso das minhas próprias tabelas no banco intão montei os seguintes selects:

#Código

select COLUMN_NAME,DATA_TYPE,IS_NULLABLE,COLUMN_DEFAULT from information_schema.Columns where table_name = Fornecedores



select I.name as Chave, IK.keyno as Ordem, c.name as Coluna
from sys.sysindexes I, sys.sysindexkeys IK, sys.syscolumns C
where I.id = IK.id
and I.id = c.id
and I.indid = IK.indid
and IK.colid = C.colid
and I.id = (select id from sys.sysobjects where xtype = U and name = Fornecedores)
and IK.indid = 1 
order by IK.keyno 

Aonde Fornecedores vai ser passado via parâmetro pelo sistema, o que acontece,eu preciso de alguma forma fazer com que esses exibam juntos,tentei usar um left join com 2 inner join para montar,mais até agora não consegui nada....
Acontece que no 1º select tenho os dados de Nome da coluna,Tipo de dados,Nullo? e Default? e no 2º eu consigo retornar quem é a chave primaria da tabela em questão, porém preciso alimentar meu sistema de relatorio com apenas uma query....
Alguem consegue me ajudar? Grato de antemão (:

Joel Rodrigues
   - 23 mai 2012

Bom dia, ao meu ver, inicialmente, o que você quer fazer não tem muito sentido do ponto de vista estrutural da consulta. Veja bem, na primeira query você recuperará N linhas onde N é a quantidade de colunas da tabela Fornecedores. Na segunda consulta, você terá K linhas, onde K é a quantidade de chaves da tabela Fornecedores.
De que forma você quer exibir isso tudo junto? Oberve que pode ocorre um produto cartesiano, por exemplo: se você tiver 10 colunas na tabela, sendo 2 chaves, você terá 20 registros.
Explique melhor, como você quer exibir essas informações.

Ah, faça o teste e execute o seguinte script:
#Código

SELECT
  COLUMN_NAME,
  DATA_TYPE,
  IS_NULLABLE,
  COLUMN_DEFAULT,
  I.name as Chave,
  IK.keyno as Ordem,
  c.name as Coluna
FROM
  INFORMATION_SCHEMA.COLUMNS S, sys.sysindexes I, sys.sysindexkeys IK, sys.syscolumns C
WHERE
  S.TABLE_NAME = Fornecedor
  AND I.id = IK.id
  AND I.id = c.id
  AND I.indid = IK.indid
  AND IK.colid = C.colid
  AND I.id = (select id from sys.sysobjects where xtype = U and name = Fornecedor)
  AND IK.indid = 1 


Boa sorte.

0
|
0

Darcio Junior,
|
MVP
    23 mai 2012

Olá,é basicamente a forma de retorno que você montou
nome coluna,tipo de dado,null,default|chave,ordem,coluna

Basicamente quero que as 3 ultimas me mostrem junto de qual é a PK da tabela,retornando o restante como null,para no relatorio poder mostrar qual é a PK da tabela.

0
|
0

Joel Rodrigues
   - 23 mai 2012

Mas repare que você vai ter repetição dos dados, exemplo:
#Código

COLUNA1|...|CHAVE_1
COLUNA2|...|CHAVE_1
COLUNA3|...|CHAVE_1
...
COLUNAN|...|CHAVE_1


E não é isso que você quer, certo?
A informação de qual é a chave da tabela não está relacionada com cada coluna.
Você estaria querendo saber, para cada coluna, se ela é chave da tabela ou não? Por exemplo:
#Código
COLUNA1|...|É CHAVE
COLUNA2|...|NÃO É CHAVE
COLUNA3|...|NÃO É CHAVE
...
COLUNAN|...|NÃO É CHAVE


Seria isso?

0
|
0

Darcio Junior,
|
MVP
    23 mai 2012

Não achei o botão editar...

Basicamente preciso de algo similar ao design do manag studio so que com a parte do default junto...

ex: http://tinypic.com/r/2n0vo21/6

0
|
0

Darcio Junior,
|
MVP
    23 mai 2012

Exatamente o segundo caso Joel.

#Código

COLUNA1|...|É CHAVE
COLUNA2|...|NÃO É CHAVE
COLUNA3|...|NÃO É CHAVE
...
COLUNAN|...|NÃO É CHAVE


Exatamente isso que preciso

0
|
0

Joel Rodrigues
   - 23 mai 2012

Vou fazer aqui e já te mando. Aguarda só uns minutos enquanto termino uma atividade aqui.

0
|
0

Joel Rodrigues
   - 23 mai 2012

Conforme prometido, aí vai:
#Código

SELECT
  S.COLUMN_NAME,
  S.DATA_TYPE,
  S.IS_NULLABLE,
  S.COLUMN_DEFAULT,
  (SELECT
	CASE (SELECT
				COUNT(c.name)
			FROM
				sys.sysindexes I, sys.sysindexkeys IK, sys.syscolumns C
			WHERE I.id = IK.id
				and I.id = c.id
				and I.indid = IK.indid
				and IK.colid = C.colid
				and I.id = (select id from sys.sysobjects where xtype = U and name = Fornecedor)
				and IK.indid = 1
				AND C.NAME = S.COLUMN_NAME)
	WHEN 0 THEN NÃO É CHAVE ELSE É CHAVE END) CHAVE
FROM
  INFORMATION_SCHEMA.COLUMNS S
WHERE TABLE_NAME = Fornecedor


Qualquer dúvida, é só falar.

0
|
0

Joel Rodrigues
   - 23 mai 2012

Para uma melhor visualização do script, veja este link onde postei o código no PasteBin: http://pastebin.com/yDkGJkcR

Boa sorte.

0
|
0

Darcio Junior,
|
MVP
    23 mai 2012

Joel muitooo obrigadoo cara,achei que fosse necessario utilizar um join mais a sua solução vai me atender muito bem,obrigado um abraço

0
|
0

Joel Rodrigues
   - 23 mai 2012

Opa, fico feliz por ter ajudado.
Quando precisar, o fórum está aberto.

0
|
0