在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 = SupplierList.ReorderNumber的ItemNumber引用了表SupplierPOImport。我需要它引用视图中的ItemNumber,因为这是在与VB.NET应用程序对话,该应用程序将数据导入表SupplierPOImport。使用View,我能够为应用程序中数据网格中的每一行编写逻辑。

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

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

当我尝试执行以下操作时,我会收到以下错误:

视图或函数"SupplierPOImport_Errors"包含自引用。视图或函数不能直接或间接引用它们自己。

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

您的原始问题在列中返回YES或NO,但您作为答案提出的函数返回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

在请求6中,您对执行INNER JOIN

SupplierPOImport_Errors 

该名称与您试图创建的视图的名称相同。这就是问题所在。我想你已经有一张同名的桌子了。如果是这种情况,只需为正在创建的视图使用不同的名称。用T_预混合表和用V_预混合视图是一种有用的命名约定,可以避免

最新更新