Classic ASP MS SQL 2014 - 带大小写的空字段

Classic ASP MS SQL 2014 - Empty fields with Case When

我有一个存储过程接受名为@UserCurrency 的参数。

SELECT ItemID,    
CASE WHEN @UserCurrency=p.ItemCurrency THEN
       p.ItemPrice
   ELSE
       CASE WHEN p.ItemPrice = 999999999 THEN
            p.ItemPrice
       ELSE
            p.ItemPrice * CASE WHEN @UserCurrency = 'GBP' THEN c.GBP
             WHEN @UserCurrency = 'USD' THEN c.USD
             WHEN @UserCurrency = 'EUR' THEN c.EUR
             END
       END
   END As Price,
FROM Items p
LEFT JOIN CurrencyRates c
ON c.CurrencyFrom = p.ItemCurrency

数据库中的每个项目都有一个 ItemPrice(DECIMAL 10,0),可能采用多种货币(欧元、英镑、美元、南非兰特等)之一,具体取决于项目的位置。

CurrencyRates table 有行 DECIMAL(5,2):

CurrencyFrom     EUR     USD     GBP
EUR              null    1.36    0.81
GBP              1.17    1.6     null
USD              0.71    null    0.63

在网站上,用户可以选择他们希望以何种货币显示项目。

我检查 UserCurrency 是否与存储过程中的 ItemCurrency 匹配。如果是,那么我只是 select ItemPrice,因为它不需要转换。如果否,那么我会查找 table 货币换算值来计算通过 JOIN 显示的正确价格。

我的问题是,如果我 运行 SSMS 上的过程使用网页传入的完全相同的值,我总是可以使这些值起作用。但是如果我在网页上查看它,first Item 有 ItemPrice 但后续记录的 none 有。

如果我删除完整的 CASE WHEN 并且只删除 select ItemPrice 本身,所有价格都会正确显示在网站上。这似乎是 CASE WHEN 以某种奇怪的方式绊倒了 ASP。

SELECT ItemID,
ItemPrice
FROM Items

我了解到 ASP 记录集中的空字段可能是由 NVARCHAR(MAX) 引起的,但我的 SELECT.

中没有 NVARCHAR(MAX)

连接字符串

SET connect = server.CreateObject ("ADODB.connection")
dbstring = "Provider=SQLNCLI11;DataTypeCompatibility=80;Server=theserver.com; Database=thedatabase;uid=theuser;pwd=thepassword"
connect.Open dbstring

记录集打开

items.open "ItemStoredProcedure " & var_PAGENUMBER & "," & var_ITEMSPERPAGE & "," & var_SORTING & "," & var_USER_CURRENCY

循环

IF NOT items.EOF THEN

items.MOVEFIRST

DO WHILE NOT items.EOF

response.write items("Price")
items.MOVENEXT
LOOP

END IF

这是怎么回事?请帮忙!

完全公开

我认为问题不在于 ASP 代码,而在于你的 SP,你需要按照以下方式重写代码,使用 COALESCE[ 将空值重置为 1 =14=] 方法

SELECT ItemID,    
    CASE WHEN p.ItemPrice = 999999999 THEN
        p.ItemPrice
    ELSE
        p.ItemPrice * (CASE WHEN @UserCurrency = 'GBP' THEN COALESCE(c.GBP, 1)
             WHEN @UserCurrency = 'USD' THEN COALESCE(c.USD, 1)
             WHEN @UserCurrency = 'EUR' THEN COALESCE(c.EUR, 1)
             ELSE 1
             END)
    END As Price,
FROM Items p
LEFT JOIN CurrencyRates c
ON c.CurrencyFrom = p.ItemCurrency