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
这是怎么回事?请帮忙!
完全公开
- 项目中有 nvarchar(max) 个字段 table
- 我确实想在同一个过程中 select nvarchar(max) 字段,但是为了测试这个问题,它们被完全注释掉了
- select 中还有其他 int 和 varchar 字段,但为了清楚起见我没有包括它们
我认为问题不在于 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
我有一个存储过程接受名为@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
这是怎么回事?请帮忙!
完全公开
- 项目中有 nvarchar(max) 个字段 table
- 我确实想在同一个过程中 select nvarchar(max) 字段,但是为了测试这个问题,它们被完全注释掉了
- select 中还有其他 int 和 varchar 字段,但为了清楚起见我没有包括它们
我认为问题不在于 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