T-SQL: COUNT не считается должным образом - PullRequest
1 голос
/ 08 марта 2011

Мне нужно выполнить следующий запрос внутри функции SQL в SQL Server 2008.

Примечание: @ncuota, @ccod, @cfecha и @rut - аргументы функции, для которых заданы правильные типы переменных.

DECLARE @cpagos int
SELECT @cpagos = COUNT(Pago_NPago)
FROM Pago_Costa AS p INNER JOIN
(
SELECT Cancela_NPago, Cancela_TipoPago
FROM Cancela_Costa AS cc INNER JOIN Cuota_Costa AS cuota
ON Cancela_ConcCod = Cuota_ConcCod AND Cancela_ConcFecha = Cuota_ConcFecha
WHERE Cuota_NCuota = @ncuota AND Cancela_ConcCod = @ccod AND Cancela_ConcFecha = @cfecha
) AS c
ON c.Cancela_NPago=p.Pago_NPago AND c.Cancela_TipoPago = p.Pago_TipoPago
WHERE Pago_AlumnoRut = @rut
GROUP BY Pago_AlumnoRut

Однако @cpagos получает либо значение NULL (если я использую GROUP BY), либо 0 (если я не использую), но если я выполняю запрос как обычный запрос, а не внутри функции, он работает правильно и возвращает значение 2. Что здесь не так? Заранее спасибо.

ТАБЛИЦА ОПРЕДЕЛЕНИЙ:

Pago_Costa:
- Pago_NPago PK bigint
- Pago_TipoPago PK bit
- Pago_AlumnoRut FK nvarchar(9)
- Pago_Monto bigint
- Pago_FPago date
- Pago_TipoDoc smallint
- Pago_RefBoleta FK bigint
- Pago_RefTipoPago FK bit
- Pago_Obs nvarchar(200)

Cuota_Costa
- Cuota_NCuota PK smallint
- Cuota_ConcCod FK PK smallint
- Cuota_ConcFecha PK FK int
- Cuota_Valor biging

Cancela_Costa
- Cancela_NPago PK FK bigint
- Cancela_TipoPago PK FK bit
- Cancela_NCuota PK FK smallint
- Cancela_ConcCod PK FK smallint
- Cancela_ConcFecha PK FK int
- Cancela_Monto bigint
- Cancela_Cheque FK nvarchar(20)

FUNCTION. Я буду использовать модифицированную версию функции, которую я использую для проверки запроса.

FUNCTION verificaPagoCuotas
(
@rut nvarchar,
@ncuota smallint,
@ccod smallint,
@cfecha int
)
RETURNS int
AS
BEGIN
DECLARE @cpagos int, @valor bigint
-- @valor is the real variable to be returned, but right now we're testing so it'll be @cpagos
SET @cpagos = (SELECT COUNT(Pago_NPago)
FROM Pago_Costa AS p INNER JOIN
(
SELECT Cancela_NPago, Cancela_TipoPago
FROM Cancela_Costa AS cc INNER JOIN Cuota_Costa AS cuota
ON Cancela_ConcCod = Cuota_ConcCod AND Cancela_ConcFecha = Cuota_ConcFecha AND Cancela_NCuota = Cuota_NCuota
WHERE Cancela_NCuota = @ncuota AND Cancela_ConcCod = @ccod AND Cancela_ConcFecha = @cfecha
) AS c
ON c.Cancela_NPago=p.Pago_NPago AND c.Cancela_TipoPago = p.Pago_TipoPago
WHERE Pago_AlumnoRut = @rut
RETURN @cpagos
... -- More irrelevant code
END

Ответы [ 2 ]

1 голос
/ 08 марта 2011

Вам нужно сузить проблему. Во-первых, вы должны использовать Set вместо Select. Set выдаст ошибку, если будет возвращено более одной строки, тогда как Select не будет. Вот почему включение Group By не выдало ошибку, когда она была добавлена, хотя и должна. Я бы исключил Группу К.

Теперь итерации, чтобы попробовать:

  1. Какой счет при использовании Count(*) вместо Count(Pago_Npago)?
  2. Сколько считается, когда вы используете только внутреннее соединение?
  3. Каков счет, когда вы исключаете Where Pago_Alumnorut = @Rut
  4. Каков счет, когда вы меняете Внутреннее соединение на левое соединение и меняете счет на Count(Cancela_NPago)?

Когда вы устраняете невозможное, все, что остается, каким бы невероятным оно ни было, должно быть истиной.

Если вы выполняете запрос непосредственно в SSMS и используете функцию с использованием идентичных параметров, а результаты отличаются, тогда запрос в функции должен отличаться от того, который вы выполняли в SSMS.

0 голосов
/ 08 марта 2011

Ответ слишком прост. Моя проблема в том, что я объявил просто "nvarchar", но я не указал длину. Когда я перешел на nvarchar (8), проблема исправлена ​​автоматически. Спасибо за вашу огромную помощь!

...