В моей базе данных SQL Server 2012 у меня есть таблица MyTable
, представление MyView
и скалярная функция MyFun
.
Представление будет ссылаться на MyFun
, как показано ниже :
CREATE VIEW [dbo].[MyView]
AS
SELECT dbo.MyFun(Age) AS Expr1
FROM dbo.MyTable
Хотя функция будет ссылаться на MyView
, как показано здесь:
CREATE FUNCTION [dbo].[MyFun] (@Age int)
RETURNS int
WITH EXECUTE AS CALLER
AS
BEGIN
SET @Age = (SELECT COUNT(*) FROM [db].[MyView]);
RETURN (@Age + 1);
END;
Поскольку MyFun
и MyView
вызовут циклическую ссылку, которая должна быть создан первым? Я не могу найти никаких документов по этому поводу.
Я провел тест.
Сначала я экспортирую базу данных как сценарий. Затем я обнаружил в сценарии, что функция создается первой, как показано ниже:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[MyFun] (@Age int)
RETURNS int
WITH EXECUTE AS CALLER
AS
BEGIN
SET @Age = (SELECT COUNT(*) FROM [db].[MyView]);
RETURN(@Age + 1);
END;
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[MyTable]
(
[Name] [nchar](10) NULL,
[Age] [int] NULL
) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE VIEW [dbo].[MyView]
AS
SELECT dbo.MyFun(Age) AS Expr1
FROM dbo.MyTable
GO
Однако, если я изменю сценарий и добавлю создание функции после создания представления, как показано ниже:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[MyTable]
(
[Name] [nchar](10) NULL,
[Age] [int] NULL
) ON [PRIMARY]
GO
CREATE VIEW [dbo].[MyView]
AS
SELECT dbo.MyFun(Age) AS Expr1
FROM dbo.MyTable
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[MyFun] (@Age int)
RETURNS int
WITH EXECUTE AS CALLER
AS
BEGIN
SET @Age = (SELECT COUNT(*) FROM [db].[MyView]);
RETURN(@Age + 1);
END;
GO
Тогда создание представления сообщит о следующей ошибке:
Msg 4121, Level 16, State 1, Procedure MyView, Line 3 [Batch Start Line 17]
Cannot find each column » dbo "или определяемая пользователем функция или агрегат" dbo.MyFun ", или имя неоднозначно.
Итак, на основе теста, для циклической ссылки, функция должна быть создана до представления, и функция может ссылаться на объекты, которые еще не были созданы.
Но как насчет других объектов, таких как значения по умолчанию, триггеры, возвращающие табличное значение функции, хранимые процедуры и т. д. c. Если они круговые, относятся друг к другу, то какой из них следует создать в первую очередь, а какой можно создать позже?