Estou executando o seguinte em uma instância no servidor:
SELECT c.*
FROM sys.columns c
WHERE c.object_id = OBJECT_ID(@tablename);
Tudo funciona muito bem.
Gostaria de executar a mesma instrução, mas apontá-la para outro banco de dados no servidor.
databaseName.dbo.tablename
Eu tentei o seguinte (e outras variações), mas não funcionou.
SELECT c.*
FROM sys.columns c
WHERE c.object_id = OBJECT_ID('databaseName.dbo.tablename');
Existe uma maneira de obter as informações da coluna em um banco de dados de outro?
Código:
SELECT @SQL = @SQL + 'INSERT INTO myTable
(ColumnName,ColumnValue,SID,SName,RID,RName)
VALUES (''' + QUOTENAME(c.name) + ''',NULL,0,NULL,0,NULL);'
FROM sys.columns c
WHERE c.object_id = OBJECT_ID(@tablename);
EXEC(@SQL);
Existe uma maneira de fazer isso dinamicamente? Se eu tivesse um @DBName
parâmetro que estivesse passando.
Adicione o banco de dados que você deseja consultar na frente do sys.columns.
Você pode fazer isso dinamicamente desta maneira:
Isso é um pouco mais seguro, IMHO, do que concatenar
@dbname
na declaração.Se você precisar de suporte para mais de
dbo
(novamente, fiz uma suposição com base em todas as consultas da pergunta), é fácil adicionar:Você também pode juntar tabelas do sistema no banco de dados remoto
Nesse caso, se você tivesse a mesma tabela em vários esquemas, obteria resultados incorretos. Você pode corrigir isso também juntando-se à tabela sys.schemas com o esquema do nome da tabela.
*SQL atualizado para ser dinâmico conforme solicitado na pergunta atualizada
A solução @tpet requer o nome completo da tabela, ou seja, com o banco de dados e o prefixo do esquema:
A consulta SQL alternativa abaixo funcionará apenas com o nome da tabela: