Как связать две таблицы, находящиеся в разных базах данных (SQL Server)?
Мне нужно получить значение из таблицы в другой базе данных; если бы таблицы были в той же базе данных, это было бы довольно легко, но так как они не являются, это усложняет дело. Я пробовал это:
SELECT TOP 8 prosql05.sa.cpsdata.M.membername,
P.*
FROM prosql05.sa.bidata.priceexceptionhistorycsr P
JOIN prosql05.sa.cpsdata.members M
ON P.memberno = M.memberno
WHERE invoicedate BETWEEN '2016-09-04' AND '2016-09-10'
ORDER BY invoicedate
...но получить err msg (в LINQPad),
Ошибка 208: недопустимое имя объекта ' sa.Бидата.PriceExceptionHistoryCSR'.
Я почти уверен, что это возможно (так как они оба на PROSQL05), но как?
Соединение, выбранное в LINQPad, является "PROSQL05.СА.BIData"
Обновление
Я изменил свою попытку на это:
select top 8 M.MemberName, P.*
from PriceExceptionHistoryCSR P, PROSQL05.sa.CPSData M
where InvoiceDate between '2016-09-04' and '2016-09-10'
and M.MemberNo = P.MemberNo
order by invoicedate
...а теперь получаем, "ошибка 208: недопустимое имя объекта 'PROSQL05. sa. CPSData'."
Это имеет больше смысла для меня, но мне все еще нужно знать, как сделать таблицу из другой базы данных (Schema, IOW CPSData) доступной из схемы/базы данных BIData.
Обновление 2
В соответствии с диалогом свойств LINQPad сервер = PROSQL05, имя пользователя = sa и база данных = Бидата.
Итак, как это знание влияет на то, как должен быть структурирован SQL?
4 ответов:
При обращении к базе данных вы Всегда должны использовать эту форму
<servername>.<databasename>.<schemaname>.<tablename>Если ваше соединение находится на том же сервере, вы можете опустить первую часть, оставив вам
<databasename>.<schemaname>.<tablename>Если ваше соединение с той же базой данных, вы можете опустить первую часть снова
Но давайте сделаем резервную копию, вы пытаетесь получить доступ к другой базе данных на том же сервере. Это означает, что одну из баз данных можно опустить, а другую необходимо указать. Я предполагаю, что все ваши столы являются в схеме<schemaname>.<tablename>dbo, которая является , вероятно, случаем.Вы должны делать такие запросы, если ваше соединение напрямую связано с
bidataSELECT TOP 8 M.membername, P.* FROM dbo.priceexceptionhistorycsr P JOIN cpsdata.dbo.members M ON P.memberno = M.memberno WHERE invoicedate BETWEEN '2016-09-04' AND '2016-09-10' ORDER BY invoicedate
Прогугливание вашего errormessage показывает, что это не сообщение linqpad, а ошибка sql-сервера. Итак, похоже, в вашем запросе есть ошибка. Я думаю, есть один из
- опечатка
- acl-Задача
Вы уверены, что ваш пользователь имеет доступ к обеим базам данных / схемам?
Предполагая, что ваша" связь " не является тем, чем кажется (и, очевидно, согласно вашему последнему комментарию к вопросу, не является), попробуйте это:
SELECT TOP 8 M.membername, P.* FROM priceexceptionhistorycsr P JOIN prosql05.cpsdata.dbo.members M ON P.memberno = M.memberno WHERE invoicedate BETWEEN '2016-09-04' AND '2016-09-10' ORDER BY invoicedate
SELECT TOP 8 prosql05.cpsdata.sa.M.membername, P.* FROM prosql05.bidata.sa.priceexceptionhistorycsr P JOIN prosql05.cpsdata.sa.members M ON P.memberno = M.memberno WHERE invoicedate BETWEEN '2016-09-04' AND '2016-09-10' ORDER BY invoicedateВы можете попробовать это.Похоже, что ваше имя схемы-sa, и вы ставите имя схемы перед именем базы данных в исходном запросе
Чтобы сделать ваш код чистым, используйте синонимы для объектов другой БД.
Например, если вы создадите синоним
sa.priceexceptionhistorycsrдля целевого объектаprosql05.bidata.sa.priceexceptionhistorycsr, Вы можете ссылаться на целевой объект только с помощью синонима.
Comments