首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用不工作的声明变量从函数创建TSQL视图

使用不工作的声明变量从函数创建TSQL视图
EN

Stack Overflow用户
提问于 2022-04-04 17:39:59
回答 1查看 69关注 0票数 0

我可以使用下面的代码轻松地从函数创建SQL视图。

代码语言:javascript
复制
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引发几条错误消息。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-04 17:54:03

您不能在视图中声明变量;CREATE VIEW只是SELECT (或以CTE开头的SELECT )的包装器,不能被参数化。试图用视图中的值对这些变量进行硬编码,似乎一开始就违背了使用变量的目的:为了更改这些值,您需要修改视图。

接下来,你似乎想说:

代码语言:javascript
复制
SELECT * FROM <stored_procedure>;

您不能以这种方式与存储过程交互。如果这实际上是一个具有坏名称的表值函数,则应该重命名它,因为在赋予函数一个sp_前缀具有误导性这一事实的基础上,您不应该在任何事情上使用sp_前缀。(背景.)

你可以像这样接近你想要的东西:

代码语言:javascript
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71741522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档