SQL: 将SETting值发布到SELECT语句值
SQL: Issue SETing value to SELECT statement value
简短版本:无论将什么 UnitRateID 传递给函数并存储在@UnitRateID
中,SET @UnitRate 始终设置为相同的值
长版:当我的函数在不同的@UnitRateID 中传递时,我无法将@UnitRate 设置为不同的值。似乎无论传入什么 @UnitRateID,我总是会从我的 SELECT 语句中得到 UnitRate returned,我将 @UnitRate 设置为 UnitRateID 的值 11.
我相信我正确地传递了一个不同的值,因为我用于创建预订的存储过程将使用不同的 UnitRateID
正确地填充我的 table
我还应该注意,如果我将 SELECT 语句和 运行 它放在 @UnitRate 的设置之外,并手动将 WHERE ur.UnitRateID = @UnitRateID 设置为 WHERE ur.UnitRateID = n 其中 n 是我的 UnitRateID 我将得到不同的 return 值。有一个注释掉的部分,我在其中测试以查看是否由于我计算住宿税率的其他函数而出现问题,并且我发现当我将@deposit 设置为@UnitRate 时,该错误确实在该函数中,因为无论传入的 UnitRateID 是什么,我都得到相同的存款价值(@UnitRate 的存款价值)。
我这里的 SETing 语法正确吗?我如何设置它以使其始终抓取并且 return 例如 UnitRateID 为 11 的值是否有问题?
我无法分享数据库模式本身的细节,但如果需要任何更多信息来分析问题,请告诉我!
CODE:我计算存款的函数...
CREATE FUNCTION dbo.CalculateDeposit
(
@UnitRateID smallint,
@ResCheckInDate date
)
RETURNS smallmoney
AS
BEGIN
DECLARE @deposit smallmoney
DECLARE @PropertyID smallint
DECLARE @UnitRate smallmoney
SET @deposit = 0
SET @UnitRate = (
SELECT ur.UnitRate
FROM UnitRate as ur
WHERE ur.UnitRateID = @UnitRateID
)
SET @PropertyID = (
SELECT p.PropertyID
FROM Property as p
JOIN UnitRate as ur
ON ur.PropertyID = p.PropertyID
AND ur.UnitRateID = @UnitRateID
)
SET @deposit = ROUND((@UnitRate + (@UnitRate * (0.01 *(SELECT (dbo.GetLodgingTaxRate(@PropertyID, @ResCheckInDate)))))), 2);
--The below commented out section is for testing
--SET @deposit = @UnitRate
RETURN @deposit
END
GO
调用示例[=48=]:
SET @deposit = dbo.CalculateDeposit(@UnitRateID, 'YYYY-MM-DD')
然后我获取该存款值并将其传递到存储过程中。并不是说这里的 @UnitRateID 和 @deposit 不在我展示的函数中,因此不在同一范围内。 @UnitRateID 实际上是一个硬编码值,当我通常调用它并且@deposit 被传递到我的存储过程中时。
编辑:
请求 属性 和 UnitRate Table 数据:http://gyazo.com/3f399914bd889c52e4cc85be97fcc2e6
问题可能不是代码??:
我在这里发帖时假设,在检查了大量数据和其他代码之后,我的代码和语法存在一些问题。我根据注释掉的 SET @deposit = @UnitRate 测试将它隔离到发布的函数中......似乎错误可能不是语法而是我的数据和/或 tables 本身?大家怎么看?
return 的 @UnitRate
的值似乎还可以。
很难理解为什么你的函数 return 中的 SET @UnitRate
总是与 UnitRateID = 11
相关联的值只有那些提供的元素。
不幸的是,您不能在 TSQL
中的函数内使用 PRINT
语句(here Whosebug 中的 post)。
您可以尝试另一种方法:修改函数和 return @UnitRate
的值,并尝试了解问题是否出在函数内。
这里有一个示例(我尽可能地尝试使其符合提供的架构和数据):
IF OBJECT_ID(N'dbo.UnitRate', N'U') IS NOT NULL
DROP TABLE dbo.UnitRate;
CREATE TABLE dbo.UnitRate (
UnitRateID SMALLINT PRIMARY KEY
, UnitRate SMALLMONEY
, PropertyID SMALLINT
);
INSERT INTO dbo.UnitRate VALUES
(11, 300, 22000)
, (12, 350, 23450);
GO
IF OBJECT_ID(N'dbo.CalculateDeposit', N'FN') IS NOT NULL
DROP FUNCTION dbo.CalculateDeposit;
GO
CREATE FUNCTION dbo.CalculateDeposit
(
@UnitRateID smallint
)
RETURNS smallmoney
AS
BEGIN
DECLARE @UnitRate smallmoney
SET @UnitRate = (
SELECT ur.UnitRate
FROM UnitRate as ur
WHERE ur.UnitRateID = @UnitRateID
)
RETURN @UnitRate
END;
GO
测试结果:
SELECT UnitRateID, UnitRate, PropertyID, dbo.CalculateDeposit(UnitRateID) as FN_UnitRate
FROM dbo.UnitRate;
输出:
UnitRateID UnitRate PropertyID FN_UnitRate
11 300.00 22000 300.00
12 350.00 23450 350.00
如您所见,函数 return 始终是关联到 UnitRateID
的 UnitRate
的正确值。
我认为问题一定出在其他地方...
希望这个方法对你有所帮助。
简短版本:无论将什么 UnitRateID 传递给函数并存储在@UnitRateID
中,SET @UnitRate 始终设置为相同的值长版:当我的函数在不同的@UnitRateID 中传递时,我无法将@UnitRate 设置为不同的值。似乎无论传入什么 @UnitRateID,我总是会从我的 SELECT 语句中得到 UnitRate returned,我将 @UnitRate 设置为 UnitRateID 的值 11.
我相信我正确地传递了一个不同的值,因为我用于创建预订的存储过程将使用不同的 UnitRateID
正确地填充我的 table我还应该注意,如果我将 SELECT 语句和 运行 它放在 @UnitRate 的设置之外,并手动将 WHERE ur.UnitRateID = @UnitRateID 设置为 WHERE ur.UnitRateID = n 其中 n 是我的 UnitRateID 我将得到不同的 return 值。有一个注释掉的部分,我在其中测试以查看是否由于我计算住宿税率的其他函数而出现问题,并且我发现当我将@deposit 设置为@UnitRate 时,该错误确实在该函数中,因为无论传入的 UnitRateID 是什么,我都得到相同的存款价值(@UnitRate 的存款价值)。
我这里的 SETing 语法正确吗?我如何设置它以使其始终抓取并且 return 例如 UnitRateID 为 11 的值是否有问题?
我无法分享数据库模式本身的细节,但如果需要任何更多信息来分析问题,请告诉我!
CODE:我计算存款的函数...
CREATE FUNCTION dbo.CalculateDeposit
(
@UnitRateID smallint,
@ResCheckInDate date
)
RETURNS smallmoney
AS
BEGIN
DECLARE @deposit smallmoney
DECLARE @PropertyID smallint
DECLARE @UnitRate smallmoney
SET @deposit = 0
SET @UnitRate = (
SELECT ur.UnitRate
FROM UnitRate as ur
WHERE ur.UnitRateID = @UnitRateID
)
SET @PropertyID = (
SELECT p.PropertyID
FROM Property as p
JOIN UnitRate as ur
ON ur.PropertyID = p.PropertyID
AND ur.UnitRateID = @UnitRateID
)
SET @deposit = ROUND((@UnitRate + (@UnitRate * (0.01 *(SELECT (dbo.GetLodgingTaxRate(@PropertyID, @ResCheckInDate)))))), 2);
--The below commented out section is for testing
--SET @deposit = @UnitRate
RETURN @deposit
END
GO
调用示例[=48=]:
SET @deposit = dbo.CalculateDeposit(@UnitRateID, 'YYYY-MM-DD')
然后我获取该存款值并将其传递到存储过程中。并不是说这里的 @UnitRateID 和 @deposit 不在我展示的函数中,因此不在同一范围内。 @UnitRateID 实际上是一个硬编码值,当我通常调用它并且@deposit 被传递到我的存储过程中时。
编辑:
请求 属性 和 UnitRate Table 数据:http://gyazo.com/3f399914bd889c52e4cc85be97fcc2e6
问题可能不是代码??:
我在这里发帖时假设,在检查了大量数据和其他代码之后,我的代码和语法存在一些问题。我根据注释掉的 SET @deposit = @UnitRate 测试将它隔离到发布的函数中......似乎错误可能不是语法而是我的数据和/或 tables 本身?大家怎么看?
return 的 @UnitRate
的值似乎还可以。
很难理解为什么你的函数 return 中的 SET @UnitRate
总是与 UnitRateID = 11
相关联的值只有那些提供的元素。
不幸的是,您不能在 TSQL
中的函数内使用 PRINT
语句(here Whosebug 中的 post)。
您可以尝试另一种方法:修改函数和 return @UnitRate
的值,并尝试了解问题是否出在函数内。
这里有一个示例(我尽可能地尝试使其符合提供的架构和数据):
IF OBJECT_ID(N'dbo.UnitRate', N'U') IS NOT NULL
DROP TABLE dbo.UnitRate;
CREATE TABLE dbo.UnitRate (
UnitRateID SMALLINT PRIMARY KEY
, UnitRate SMALLMONEY
, PropertyID SMALLINT
);
INSERT INTO dbo.UnitRate VALUES
(11, 300, 22000)
, (12, 350, 23450);
GO
IF OBJECT_ID(N'dbo.CalculateDeposit', N'FN') IS NOT NULL
DROP FUNCTION dbo.CalculateDeposit;
GO
CREATE FUNCTION dbo.CalculateDeposit
(
@UnitRateID smallint
)
RETURNS smallmoney
AS
BEGIN
DECLARE @UnitRate smallmoney
SET @UnitRate = (
SELECT ur.UnitRate
FROM UnitRate as ur
WHERE ur.UnitRateID = @UnitRateID
)
RETURN @UnitRate
END;
GO
测试结果:
SELECT UnitRateID, UnitRate, PropertyID, dbo.CalculateDeposit(UnitRateID) as FN_UnitRate
FROM dbo.UnitRate;
输出:
UnitRateID UnitRate PropertyID FN_UnitRate
11 300.00 22000 300.00
12 350.00 23450 350.00
如您所见,函数 return 始终是关联到 UnitRateID
的 UnitRate
的正确值。
我认为问题一定出在其他地方...
希望这个方法对你有所帮助。