Я хотел бы использовать FME для обработки плана выполнения из SQL Server (я пытаюсь получить таблицу со строкой для каждого поля, которое используется в запросе).
Функция SET SHOWPLAN_XML ON
должна запускаться в собственном пакете. Обычным способом для нас был бы оператор GO
, однако он не является частью T-SQL, но обычно интерпретируется утилитами sqlcmd и osql, и поэтому интерпретатор FME SQL его не понимает. Я попытался запустить «SET SHOWPLAN_XML ON» в одном преобразовании SQLExecutor, за которым последовал запрос в следующем SQLExecutor, но каждое преобразование, похоже, создает свое собственное соединение, что означает, что параметр Showplan не сохраняется от одного преобразователя к другому.
У меня была мозговая волна, и мне удалось использовать преобразователь Python, чтобы запустить его с помощью pyodbc
. Это может выполнять запросы в их собственном пакете, сохраняя при этом одно соединение. Мой трамформер Python Caller выглядит следующим образом:
import fmeobjects
import pyodbc
class FeatureCreator(object):
def __init__(self):
pass
def input(self,feature):
newFeature = fmeobjects.FMEFeature()
connectionStr = f"DRIVER = {{SQL Server}};SERVER = {FME_MacroValues['Server']};Trusted_Connection=yes;"
if FME_MacroValues['Database'] != '':
connectionStr += f"DATABASE = {FME_MacroValues['Database']};"
connection = pyodbc.connect(connectionStr)
cursor = connection.cursor()
cursor.execute("SET SHOWPLAN_XML ON;")
cursor.commit()
cursor.execute(feature.getAttribute('query'))
results = cursor.fetchall()[0][0]
newFeature.setAttribute("showplan", results)
self.pyoutput(newFeature)
def close(self):
pass