kongalshiva549 Ответов: 2

Установите FMTONLY OFF в SQL


Недавно я присоединился к одному из проектов в своей команде. Они используют ASP.NET MVC и MS SQL вместе с Entity Framework as ORM.

Я заметил, что каждая из хранимых процедур, используемых в EF, имеет эту общую строку в начале определения хранимой процедуры
IF(0=1) SET FMTONLY OFF

Я подумал, что это очень странное состояние, поэтому немного погуглил об этом, а также спросил своих коллег об этом. Они говорят, что когда EF сопоставляет хранимую процедуру, она отправляет все параметры как null и пропускает весь цикл if. Следовательно, он также пропустил бы условие IF(0=1) и тогда SET FMTONLY OFF
О поиске SET FMTONLY OFF MSDN, говорит
Цитата:

Возвращает клиенту только метаданные. Может использоваться для проверки формата ответа без фактического выполнения запроса.


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

Я до сих пор не имею четкого представления, зачем это нужно. Если кто-то может объяснить это немного подробно или направить меня к какой-то ссылке, которая охватывает эту тему, это будет означать для меня целый мир.

Что я уже пробовал:

просто зашел в гугл и не нашел правильного решения

CHill60

Конечно же, вы должны предоставить администраторам баз данных сценарий для создания хранимых процедур? Тогда ваша проблема исчезнет

Richard MacCutchan

Вам не приходило в голову спросить об этом кого-нибудь из действующих членов команды?

2 Ответов

Рейтинг:
6

CHill60

Первое, что я нашел в Google:

It turns out that FMTONLY is set to off by default as you had said, but when aplications like SQL Reporting Services and Visual Studio read the SP's for the first time, (to get the column names), they read them with FMTONLY set to on. When FMTONLY is set to on, all column names (metadata) are read while the actual rows returned is zero. This allows the wizard to populate the tableadapter with the avaible column headings when it is first read. Of course when the application actually makes use of the table adapter when called from say a web page, it runs the SP with FMTONLY set to off so it returns actual data. I found this to be a indentical situation with SQL Reporting Services.

Во всяком случае, когда FMTONLY установлен в on, он имеет странное поведение игнорирования условных операторов, таких как and If (condition), он просматривает всю логику, чтобы дать все возможные результирующие наборы, которые могут быть возвращены из SP. Вот почему он способен прорваться через логику IF 1=0 и отключиться. Тем не менее, когда этот параметр установлен в положение off, создание адаптера таблицы должно запустить весь SP, прежде чем он сможет получить имена столбцов, поэтому он был тайм-аут (тайм-аут по умолчанию в Visual Studio установлен на 30 секунд, а мой SP занимает около 1 минуты).

Таким образом, FMTONLY-это в значительной степени просто настройка, позволяющая приложению "просматривать" раздел кода и находить возвращаемые имена столбцов, не возвращая данные. Тем не менее, существует проблема с использованием #TempTables, потому что для того, чтобы они были видны при сканировании, выполняемом FMTONLY, код для их создания должен быть фактически запущен, поэтому мой front end парень использовал оператор " IF (1=0) BEGIN SET FMTONLY OFF END ". Это позволило бы запустить весь SP, даже если SP был прочитан с FMTONLY, изначально установленным в ON.


Рейтинг:
16

MadMyche

Ну, вы действительно не отправили вопрос, так что ответа действительно нет.

Я предполагаю, что до появления Entity Framework он использовался разработчиками для извлечения метаданных о результирующем наборе без необходимости фактически запускать запрос; во многом это похоже на результаты выполнения SP_Help в таблице.
Таким образом, хотя это могло быть полезно в прошлом, Ормы сегодня не знают, как с этим бороться.

Конечно, вы, вероятно, уже знаете, что это 2-летний вопрос дословно из Stack Overflow:
sql server - почему мы должны записывать SET FMTONLY OFF в хранимые процедуры при использовании Entity Framework - Stack Overflow[^]


kongalshiva549

:)