经过一些建议,如果有一种更简单,更有效的方式,我将要做的事情......
我在sqlserver中有一个包含产品数据的表,然后在asp.net c#中有一个前端,这已导出到excel,txt文件选项并发布到API。
现在我需要建立起来,我们为某些客户提供不同格式的产品说明等某些字段,
所以产品表就像
PT_PRODUCT|PT_DESC |PT_SIZE
ABC123 |Super Cool Ice-Cream |small
但是对于'客户1',产品描述需要是'Ice Cool Lollypop'
我打算在我的应用程序中为'Product'创建一个类,并使用主表中的值填充它,
然后查询第二个看起来像这样的表,
CUST |PRODUCT | FIELD_ID | FIELD_VAL
CU1 |ABC123 |PT_DESC |Ice Cool Lollypop
并运行类似
的内容select * from table2 where cust='CA1' and product='ABC123'
for(int i=0;i< ds.tables[0].rows.count;i++)
{
switch(ds.Tables[0].Rows[i]["FIELD_ID"])
{
case "PT_DESC":
ClassProd.DESC = ds.Tables[0].Rows[i]["FIELD_VAL");
//and so on updating the class
}
}
使用更新的类通过API更新客户站点或导出到excel ect,
现在对于轻微的曲线球,可能有大约20多个字段需要被客户数据覆盖,也沿着这条路线我将指示可以被覆盖的字段,所以想知道是否有一种在原始sql select中执行此操作的方法。
答案 0 :(得分:0)
您可以创建存储过程,忘记必须执行任何C#来获取客户的自定义产品。
此左侧加入ProductProducts表上的Product Id和Customer Id。如果它为NULL,则它没有找到客户产品描述,因此它将使用Products表中的默认描述。如果它不是NULL,则它在CustomerProducts中找到客户产品描述并使用它。
我并不完全了解您的架构,但这是要点:
CREATE PROCEDURE GetCustomerProducts
(
@CustomerId VARCHAR(255),
@ProductId VARCHAR(255)
)
AS
BEGIN
SELECT PRODUCT
,FIELD_ID
,CASE
WHEN cp.FIELD_VAL IS NOT NULL
THEN cp.FIELD_VAL
ELSE p.FIELD_VAL
END AS FIELD_VAL
FROM Products p
LEFT JOIN CustProducts cp ON cp.PT_PRODUCT = p.PT_PRODUCT
AND cp.CUST = @CustomerID
WHERE p.PT_PRODUCT = @ProductId
END
然后:
EXEC GetCustomerProducts @CustomerId = 'CU1', @ProductId = 'ABC123'