使用 DECLARE 变量不起作用的函数创建 TSQL 视图
Create TSQL view from function with DECLARE variables not working
我可以使用以下代码从函数轻松创建 SQL 视图。
IF EXISTS(SELECT * FROM [sys].[objects] WHERE object_id = object_id('InvoicedItemsView') AND OBJECTPROPERTY(object_id,'IsView')=1)
DROP VIEW [dbo].[InvoicedItemsView]
GO
CREATE VIEW [dbo].[InvoicedItemsView]
AS
SELECT * FROM sp_GetInvoicedItems('201803', '201803', '201803', '201803',NULL,NULL) AS InvoicedItems
GO
/* SELECT all data from the created view */
SELECT *
FROM [dbo].[InvoicedItemsView]
GO
但是,为什么我不能为函数创建一个带有已声明变量的视图??
下面的代码导致 TSQL 抛出几条错误消息。
IF EXISTS(SELECT * FROM [sys].[objects] WHERE object_id = object_id('InvoicedItemsView') AND OBJECTPROPERTY(object_id,'IsView')=1)
DROP VIEW [dbo].[InvoicedItemsView]
GO
CREATE VIEW [dbo].[InvoicedItemsView]
AS
DECLARE @P0 AS CHAR (6) = '201803', @P1 AS NVARCHAR (6) = '201803', @P2 AS CHAR (6) = '201803', @P3 AS NVARCHAR (6) = '201803', @P4 AS INT = NULL, @P5 AS NVARCHAR (4000) = NULL;
SELECT * FROM sp_GetInvoicedItems(@P0, @P1, @P2, @P3, NULL,NULL) AS InvoicedItems
GO
/* SELECT all data from the created view */
SELECT *
FROM [dbo].[InvoicedItemsView]
GO
不能在视图中声明变量; CREATE VIEW
只是 SELECT
(或以 CTE 开头的 SELECT
)的包装器,无法参数化。尝试 hard-code 这些具有视图内部值的变量似乎首先违背了使用变量的目的:为了更改值,您需要更改视图。
接下来,您似乎想说:
SELECT * FROM <stored_procedure>;
您不能以这种方式与存储过程进行交互。如果这实际上是一个名称不正确的 table-valued 函数,您应该重命名它,因为除了给函数加上 sp_
前缀这一事实之外,您不应该使用sp_
任何东西 的前缀。 (Background.)
您可以像这样接近您要找的东西:
CREATE VIEW dbo.InvoicedItemsView
AS
SELECT i.* -- bad practice, see sqlblog.org/selstar
FROM
(
VALUES -- this "kind of" looks like a variable list:
(
CONVERT(char(6), '201803'),
CONVERT(nvarchar(6), N'201803'),
CONVERT(char(6), '201803'),
CONVERT(nvarchar(6), N'201803'),
CONVERT(int, NULL),
CONVERT(nvarchar(4000), NULL)
)
) AS d(P0, P1, P2, P3, P4, P5)
CROSS APPLY
dbo.sp_GetInvoicedItems(P0, P1, P2, P3, P4, P5) AS i;
我可以使用以下代码从函数轻松创建 SQL 视图。
IF EXISTS(SELECT * FROM [sys].[objects] WHERE object_id = object_id('InvoicedItemsView') AND OBJECTPROPERTY(object_id,'IsView')=1)
DROP VIEW [dbo].[InvoicedItemsView]
GO
CREATE VIEW [dbo].[InvoicedItemsView]
AS
SELECT * FROM sp_GetInvoicedItems('201803', '201803', '201803', '201803',NULL,NULL) AS InvoicedItems
GO
/* SELECT all data from the created view */
SELECT *
FROM [dbo].[InvoicedItemsView]
GO
但是,为什么我不能为函数创建一个带有已声明变量的视图?? 下面的代码导致 TSQL 抛出几条错误消息。
IF EXISTS(SELECT * FROM [sys].[objects] WHERE object_id = object_id('InvoicedItemsView') AND OBJECTPROPERTY(object_id,'IsView')=1)
DROP VIEW [dbo].[InvoicedItemsView]
GO
CREATE VIEW [dbo].[InvoicedItemsView]
AS
DECLARE @P0 AS CHAR (6) = '201803', @P1 AS NVARCHAR (6) = '201803', @P2 AS CHAR (6) = '201803', @P3 AS NVARCHAR (6) = '201803', @P4 AS INT = NULL, @P5 AS NVARCHAR (4000) = NULL;
SELECT * FROM sp_GetInvoicedItems(@P0, @P1, @P2, @P3, NULL,NULL) AS InvoicedItems
GO
/* SELECT all data from the created view */
SELECT *
FROM [dbo].[InvoicedItemsView]
GO
不能在视图中声明变量; CREATE VIEW
只是 SELECT
(或以 CTE 开头的 SELECT
)的包装器,无法参数化。尝试 hard-code 这些具有视图内部值的变量似乎首先违背了使用变量的目的:为了更改值,您需要更改视图。
接下来,您似乎想说:
SELECT * FROM <stored_procedure>;
您不能以这种方式与存储过程进行交互。如果这实际上是一个名称不正确的 table-valued 函数,您应该重命名它,因为除了给函数加上 sp_
前缀这一事实之外,您不应该使用sp_
任何东西 的前缀。 (Background.)
您可以像这样接近您要找的东西:
CREATE VIEW dbo.InvoicedItemsView
AS
SELECT i.* -- bad practice, see sqlblog.org/selstar
FROM
(
VALUES -- this "kind of" looks like a variable list:
(
CONVERT(char(6), '201803'),
CONVERT(nvarchar(6), N'201803'),
CONVERT(char(6), '201803'),
CONVERT(nvarchar(6), N'201803'),
CONVERT(int, NULL),
CONVERT(nvarchar(4000), NULL)
)
) AS d(P0, P1, P2, P3, P4, P5)
CROSS APPLY
dbo.sp_GetInvoicedItems(P0, P1, P2, P3, P4, P5) AS i;