使用 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;