Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Пара интересных кверей


Автор: Vit 15.5.2002, 18:28
Хочу поделится своими изысканиями в закверении MS SQL Server.

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

SQL
SELECT * From
OpenRowSet
( 'SQLOLEDB','MyServer';'SA';'', MyDatabase.dbo.MyTable)


Здесь прикол в том что меняя значение провайдера, можно использовать в одной квере и таблицу из MS SQL Server и таблицу из любой другой базы данных, которая поддерживается ADO.

SQL
SELECT * FROM (Select * From MyTable) AS Mt


Вроде бы ничего такого, только вместо кверения таблицы, кверится другая квери - по сути создается временное View - я давно читал о возможности такого, но у меня не получалось, оказалось, что прикол в том, что выражение as обязательно!

Квери через несколько серверов:
SQL
SELECT * From MyServer.MyDatabase.dbo.mytable

Здесь фишка в том что надо указать другой сервер как linked сервер для первого (там в конфигурации это есть)


Автор: digital_pilot 1.6.2002, 19:30
наряду с OPENROWSET можно еще использовать OPENDATASOURCE как часть полностью квалифицированного имени таблицы:

SELECT * FROM OPENDATASOURCE('SQLOLEDB','Data Source=RemoteServer; User ID=sa;Password=').MyDB.dbo.MyTable

Мне приходилось пользоваться такими приколами при перебросе данных с удаленного SQL-сервера на локальный через Connection, открытый на локальном сервере. К сожалению, позже обнаружилось, что в 1 из локальных сеток метод работал только под sa, а под рядовым юзером никак не хотел. После 2-х-недельных мучений пришлось послать все это к чертовой матери :D  и воспользоваться linked server'ом - тут все работает как по маслу

Автор: Vit 1.6.2002, 19:46
А под рядовым юзером наверное ".dbo." не уместен, его надо менять на конкретного хозяина объекта, или это тоже не подходит?

Автор: Vit 1.6.2002, 19:47
Кстати OPENROWSET имеет и еще один недостаток, нельзя с помощью нее открыть базу данных на том же сервере :(

Автор: digital_pilot 1.6.2002, 21:47
Цитата(Vit @ 01.6.2002, 20:46)
А под рядовым юзером наверное ".dbo." не уместен, его надо менять на конкретного хозяина объекта, или это тоже не подходит?

да нет, в том-то и дело, что там именно dbo и был хозяином... на других сетках все работало, просто на этой какие-то настройки были другие, или еще черт знает что.

Автор: Vit 2.6.2002, 00:43
Может fierwall какой стоит, у нас такое было...

Автор: digital_pilot 2.6.2002, 03:05
Цитата(Vit @ 02.6.2002, 01:43)
Может fierwall какой стоит, у нас такое было...

да там чисто внутри локалки все шло, хрен его знает... я вообще с их сеткой не контачил, это за сотни километров от меня. Мое начальство сказало: "Ни хрена не работает!" :0  Ну вот и пришлось в спешном порядке переделывать все на linked server, тем более что я, копаясь в доках и ньюс-группах, где-то наткнулся на то, что OPENDATASOURCE не самый 100%-но замечательный и работоспособный способ  :)

Автор: Vit 2.6.2002, 03:19
Классно! Наконец-то в этом разделе появился человек с которым интересно поболтать и который разбирается в базах! Слушай, а в чем недостаток этого способа, я признаться тоже все через Linked сервера делаю, но все-таки, для общего развития? Кстати ты не работал с DTS прицельно? А то у меня есть несколько вопросов.

Автор: digital_pilot 7.6.2002, 16:37
Цитата(Vit @ 02.6.2002, 04:19)
Классно! Наконец-то в этом разделе появился человек с которым интересно поболтать и который разбирается в базах! Слушай, а в чем недостаток этого способа, я признаться тоже все через Linked сервера делаю, но все-таки, для общего развития? Кстати ты не работал с DTS прицельно? А то у меня есть несколько вопросов.

Хм... ну, я так, разбираюсь постольку-поскольку, там немного, здесь чуть чуть... :D

Насчет недостатков OPENDATASOURCE... В общем, в хэлпах пишут нечто вроде того, что в этом случае при каждом вызове этого макроса автоматически каждый раз устанавливается новый коннект, ad hoc connection, как они это зовут. И поэтому рекомендуют использовать этот способ только в тех случаях, когда кросс-серверные операции нужно выполнить всего лишь пару раз. Если же это приходится делать чаще, то рекомендуется наладить linked server.

Ну, как я уже упоминал, у самого были какие-то так и не разъясненные проблемы с правами доступа при использовании OPENDATASOURCE. Деталей, у сожалению, уже не помню.

Еще имели место проблемы с транзакциями. Когда я в Connection'е, нацеленном на локальный сервер, пытался открыть транзакцию и потом в этой транзакции через OPENDATASOURCE переносить данные с удаленного сервера на локальный, то это на некоторых системах срабатывало, на некоторых же - нет. Такие проблемы я и в ньюз-группах тоже видел, но никто ничего вразумительного сказать так и не смог. Может как-то настроить нужно было чего-нить - но мои многочисленные попытки успехом не увенчались. Так что в этой области у меня пробел :D

Linked server'а же в ситуациях с локальными транзакциями ведут себя вроде бы поприличнее. TRUNCATE TABLE, правда, отроллбэкить не разрешают, но на DELETE / INSERT / UPDATE роллбэк срабатывает нормально.

По DTS, к сожалению, ничего сказать не могу, т.к. с этим не работал. Только как юзер с экспорт-импорт-ассистентом в EM  :hehe

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)