Как вы можете получить доступ к базе данных на основе значения в другой базе данных? (TSQL) - PullRequest
1 голос
/ 14 марта 2011

Итак, у меня работает SQL Server, и у меня есть две базы данных, первая база данных хранит имя второй базы данных.В первой базе данных я хочу создать оператор, который изменяет данные во второй таблице, что-то вроде:

(это запрос из первой базы данных)

select * from [select database_name from table1].table

Iиграл с сис.Ключевое слово пытается выяснить, могу ли я сделать это, но не повезло.Любая помощь будет оценена, спасибо.

Ответы [ 3 ]

1 голос
/ 14 марта 2011

Вы должны построить строку и выполнить ее как динамический SQL. См .: Проклятие и благословения динамического SQL

declare @database_name sysname

select @database_name = database_name from Table1

declare @sql nvarchar(1000)

set @sql = N'select * from ' + @database_name + N'.SchemaName.TableName'

exec sp_executesql @sql
0 голосов
/ 14 марта 2011

Один из способов - установить динамический SQL, например:

DECLARE @Command varchar(1000)

SELECT @Command = replace('select * from <TargetDB>.dbo.table', '<TargetDB>', tabel1.database_name)
 from table1
 where [your criteria here]

EXECUTE (@Command)

Другим способом было бы создание представлений (или синонимов или связанных определений серверов), которые ссылаются на «целевую» базу данных, например,

DECLARE @Command varchar(1000)

SELECT @Command = replace('CREATE VIEW SomeView AS select * from <TargetDB>.dbo.table', '<TargetDB>', tabel1.database_name)
 from table1
 where [your criteria here]

EXECUTE (@Command)

Это создаст представление, на которое может ссылаться постоянный (то есть нединамический) код. Это не будет работать так хорошо, если целевая база данных часто меняется или если у вас много целевых баз данных.

Но, честно говоря, реальный ответ заключается в том, что нет, вы не можете сделать это вообще легко, и вы должны сделать все возможное, чтобы избежать ситуаций, когда вы должны это сделать. Поверьте мне, это может быть кошмар отладки и обслуживания.

0 голосов
/ 14 марта 2011

вы можете сделать это только выполнив динамический запрос, подобный этому:

 DECLARE @base varchar(30)
 SELECT @base = "yourOtherBase"
 EXECUTE ("select * from " + @base + "..table");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...