首页 > 解决方案 > 在 SQL Server 的视图中引用变量

问题描述

我要修改 SQL Server 中的视图。下面是查看代码:

ALTER View [dbo].[SupplierPOImport_Errors] 
AS
SELECT 
SupplierName, 
Case SupplierID WHEN 0 THEN 'NO' ELSE 'YES' END AS 'SupplierFound',
PONumber,
InvoiceNumber,
InvoiceDate,
ItemNumber,
ItemBarcode,
Description,
Quantity,
Cost, 
Tax,
Case ItemID WHEN 0 THEN 'NO' ELSE 'YES' END AS 'ItemFound',
Case PurchaseOrderID WHEN 0 THEN 'NO' ELSE 'YES' END AS 'POFound',
--Case Quantity WHEN 0 THEN 'NO' ELSE 'YES' END AS 'UnderSupplied',
(SELECT SUM(quantity * Cost) FROM SupplierPOImport) AS TotalExGST,
(SELECT SUM(quantity * Cost * (100 + Tax)/100) FROM SupplierPOImport) AS TotalIncGST,


  -- REQ 5
  Case WHEN ItemNumber = (SELECT OrderNumber
  FROM [RMS_SO_SM_PO].[dbo].[PurchaseOrderEntry]
  INNER JOIN
  [RMS_SO_SM_PO].[dbo].[PurchaseOrder]
  ON PurchaseOrder.ID = PurchaseOrderEntry.PurchaseOrderID
  WHERE 
  PurchaseOrder.PONumber = SupplierPOImport.PONumber AND
  PurchaseOrderEntry.OrderNumber = SupplierPOImport.ItemNumber) THEN 'NO' ELSE 'YES' END as 'POAdded',

-- REQ 6 A

  CASE WHEN EXISTS(SELECT ItemNumber FROM SupplierPOImport t1 
   INNER JOIN SupplierList t2 ON t1.ItemNumber = t2.ReorderNumber
   INNER JOIN ITEM t3 ON t2.ItemID = t3.ID
   INNER JOIN SupplierPOImport_Errors t ON t.ItemNumber = t1.ItemNumber 
   WHERE 
    t3.SupplierID = t1.SupplierID AND
    t1.ItemNumber = t2.ReorderNumber AND
    t1.ItemNumber = t.ItemNumber)   
    THEN 'YES' ELSE 'NO' END AS 'PRIMARY'
FROM SupplierPOImport

GO

REQ 6 返回多个记录,因为 ItemNumber forItemNumber = SupplierList.ReorderNumber指的是 table SupplierPOImport。我需要它来引用视图中的 ItemNumber,因为它正在与 VB.NET 应用程序对话,该应用程序将数据导入表 SupplierPOImport。使用视图,我可以为应用程序中数据网格中的每一行编写逻辑。

所以,我想要一种将我的查询与我的视图中的 ItemNumber 值进行比较的方法。REQ 5 的工作方式是,对于导入的每一行,它都会向 VB.NET 应用程序返回一个“是”或“否”。它检查当前 ItemNumber 是否等于查询返回的值。该查询有一个 PONumber WHERE 子句(它从视图中获取)。但是对于 REQ 6,我想要一种引用 ItemNumber 的方法。

本质上,我希望它在查询中存在我的 ItemNumber 时返回 YES。我尝试使用 TempItemNum = SupplierList.ReorderNumber 但 SQL 无法识别查询中的 TempItemNumb。

当我尝试执行此操作时,我在下面收到此错误:

视图或函数“SupplierPOImport_Errors”包含自引用。视图或函数不能直接或间接引用自己。

由于绑定错误,无法使用视图或函数“SupplierPOImport_Errors”。

标签: .netsql-servervb.net

解决方案


您的原始问题在列中返回“是”或“否”,但您作为答案提出的函数返回 ItemNumber。所以这里是你想要什么的猜测。

您发布的 SQL 实际上非常接近所需的内容。请试试这个,如果它不是你想要的,请解释为什么它不同。

我在这里只写了一篇专栏。如果这是进步,我们可以在下一个专栏上工作。

ALTER View [dbo].[SupplierPOImport_Errors] 
AS
SELECT 
SupplierName, 
Case SupplierID WHEN 0 THEN 'NO' ELSE 'YES' END AS 'SupplierFound',
PONumber,
InvoiceNumber,
InvoiceDate,
ItemNumber,
ItemBarcode,
Description,
Quantity,
Cost, 
Tax,
Case ItemID WHEN 0 THEN 'NO' ELSE 'YES' END AS 'ItemFound',
Case PurchaseOrderID WHEN 0 THEN 'NO' ELSE 'YES' END AS 'POFound',
--Case Quantity WHEN 0 THEN 'NO' ELSE 'YES' END AS 'UnderSupplied',
(SELECT SUM(quantity * Cost) FROM SupplierPOImport) AS TotalExGST,
(SELECT SUM(quantity * Cost * (100 + Tax)/100) FROM SupplierPOImport) AS TotalIncGST,

  CASE WHEN EXISTS (
  SELECT * 
  FROM [dbo].[PurchaseOrderEntry]
  INNER JOIN [dbo].[PurchaseOrder]
  ON PurchaseOrder.ID = PurchaseOrderEntry.PurchaseOrderID
  WHERE 
  PurchaseOrder.PONumber = I.PONumber AND
  PurchaseOrderEntry.OrderNumber = I.ItemNumber
  ) THEN 'NO' ELSE 'YES' END as 'POAdded'


FROM SupplierPOImport I

推荐阅读