Хотя exec(open("filename").read())
часто задается как альтернатива execfile("filename")
, он пропускает довольно много деталей, которые поддерживаются execfile
.
Следующая функция для Python3.x находится как можно ближе получить то же поведение, что и выполнение файла напрямую.
Примечания:
__main__
, некоторые сценарии зависят от этого, чтобы проверить, загружаются ли они как модуль или нет, например. if __name__ == "__main__"
__file__
лучше подходит для сообщений об исключениях, а некоторые скрипты используют __file__
для получения путей к другим файлам по отношению к ним. execfile
делает - поэтому вы можете получить доступ к любым переменным, определяемым путем чтения переменных после запуска. def execfile(filepath, globals=None, locals=None):
if globals is None:
globals = {}
globals.update({
"__file__": filepath,
"__name__": "__main__",
})
with open(filepath, 'rb') as file:
exec(compile(file.read(), filepath, 'exec'), globals, locals)
# execute the file
execfile("/path/to/somefile.py")
Примечание: в отличие от execfile
Python2, это не изменяет текущее пространство имен по умолчанию. Для этого вам нужно явно передать globals()
.
CREATE TABLE ATable (ID INTEGER, ParentID INTEGER)
INSERT INTO ATable
SELECT 1, NULL
UNION ALL SELECT 2, 1
UNION ALL SELECT 3, 2
;WITH q AS (
SELECT ID, ParentID
FROM ATable
UNION ALL
SELECT a.ID, a.ParentID
FROM ATable a
INNER JOIN q ON q.ID = a.ParentID
)
SELECT DISTINCT *
FROM q
Вот самодостаточный пример.
Declare @Temp table
(
ID int,
ParentID int,
Happened date,
Value int
)
Insert into @Temp Values
(1, null, dateadd(day,1,GetDate()),1),
(2, 1, dateadd(day,2,GetDate()),2),
(3, 1, dateadd(day,3,GetDate()),3),
(4, null, dateadd(day,4,GetDate()),10),
(5, 3, dateadd(day,5,GetDate()),50),
(6, 4, dateadd(day,5,GetDate()),50),
(7, 5, dateadd(day,5,GetDate()),90);
----------------------------------------
with Magic as
(
select *
from @Temp
Where ID = 1
union all
select t.*
from
Magic m
inner join
@Temp t
on t.ParentID = m.ID
)
select * from Magic
option (maxrecursion 3)
См. и прочитайте:
Рекурсивные запросы с использованием общих выражений таблицы
Пожалуйста, проверьте следующую ссылку о том, как писать рекурсивные запросы с использованием общих выражений таблицы: http://msdn.microsoft.com/en-us/library/ms186243.aspx