Sql server 多语句表值函数有问题,我做错了什么?
我对这个函数有问题,好像Sql server 多语句表值函数有问题,我做错了什么?,sql-server,tsql,function,Sql Server,Tsql,Function,我对这个函数有问题,好像@idUsuario和@passCorrecto没有得到任何值,所以,当我在where子句中使用这个变量时,我没有得到任何结果数据 ALTER FUNCTION [dbo].[login](@usuario varchar(20), @password varchar(20)) RETURNS @info TABLE (nombre varchar(70) not null, tipo varchar(30) not null) AS BEGIN DECLARE
@idUsuario
和@passCorrecto
没有得到任何值,所以,当我在where子句中使用这个变量时,我没有得到任何结果数据
ALTER FUNCTION [dbo].[login](@usuario varchar(20), @password varchar(20))
RETURNS @info TABLE (nombre varchar(70) not null, tipo varchar(30) not null)
AS
BEGIN
DECLARE @idUsuario int = dbo.usuarioExiste(@usuario)
DECLARE @passCorrecto bit = dbo.passwordCorrecto(@idUsuario, @password)
INSERT @info
SELECT
usuarios.nombreUsuario, tiposUsuarios.tipoUsuario
FROM
usuarios
LEFT JOIN
tiposUsuarios
ON
usuarios.idTipoUsuario = tiposUsuarios.idTipoUsuario
WHERE
usuarios.idUsuario = @idUsuario and
usuarios.estatus = 'ACTIVO' and
@passCorrecto = 1
RETURN
END
我做错了什么
编辑
下面是上面使用的函数:
ALTER FUNCTION [dbo].[usuarioExiste]
(
@usuario varchar(20)
)
RETURNS integer
AS
BEGIN
DECLARE @idUsuario integer
SELECT
@idUsuario = idUsuario
FROM
usuarios
WHERE
usuario = @usuario
if @idUsuario is null begin
set @idUsuario = 0
end
RETURN @idUsuario
END
ALTER FUNCTION [dbo].[passwordCorrecto]
(
@usuario varchar(20),
@password varchar(20)
)
RETURNS bit
AS
BEGIN
DECLARE @esCorrecto bit
SELECT
@esCorrecto = case when password = @password then 1 else 0 end
FROM
usuarios
WHERE
usuario = @usuario
RETURN @esCorrecto
END
编辑2
正如Beth所建议的,我创建了新函数,返回我需要的值,如下所示:
CREATE FUNCTION [dbo].[usuarioExisteTest]
(
@usuario varchar(20)
)
RETURNS int
AS
BEGIN
declare @idUsuario int;
set @idUsuario = 1;
return (@idUsuario);
END;
通过这样做,我得到了我需要的数据,我是否设置了返回原始函数的错误方式的值
DECLARE @idUsuario integer
SELECT
@idUsuario = idUsuario
FROM
usuarios
WHERE
usuario = @usuario
我知道SQL Server 2008支持组合声明/分配,但您是否尝试过将它们分开
DECLARE @idUsuario int
SET idUsuario = dbo.usuarioExiste(@usuario)
DECLARE @passCorrecto bit
SET passCorrecto = dbo.passwordCorrecto(@idUsuario, @password)
为变量指定一个值
串联。该值可以是常量
或者一个表达式,但它必须
匹配变量声明类型或
可以隐式地转换为那个
类型
当然,udf是一个表达式,但在DECLARE中使用时是否可能存在一些异常(比如在CHECK约束中使用udf:它不可靠)。或者出于某种原因将ins声明为udf
请迁就我。试试看
此外,在dbo.passwordCorrecto中没有“failsafe”,这意味着它可能返回NULL,而在外部udf中,NULL的计算结果将始终为false 声明变量后,请尝试打印变量值。如果设置不正确,请尝试在新的查询窗口中而不是在[dbo].[login]中调用这些函数。这应该有助于识别问题。我找到了一个解决方案,似乎使用select
@var=some\u value
不起作用
这些是固定的功能:
通常存在
CREATE FUNCTION [dbo].[usuarioExiste]
(
@usuario varchar(20)
)
RETURNS int
AS
BEGIN
declare @idUsuario int = 0;
set @idUsuario = (
select
idUsuario
from
usuarios
where
usuario = @usuario);
if @idUsuario is null begin
set @idUsuario = 0;
end;
return (@idUsuario);
END;
密码更正
CREATE FUNCTION [dbo].[passwordCorrecto]
(
@idUsuario int,
@password varchar(20)
)
RETURNS bit
AS
BEGIN
declare @esCorrecto bit = 'false';
set @esCorrecto = (
select
case when password = @password then 'true' else 'false' end
from
usuarios
where
usuarios.idUsuario = @idUsuario);
return (@esCorrecto);
END;
和登录
CREATE FUNCTION [dbo].[login](@usuario varchar(20), @password varchar(20))
RETURNS @info TABLE (nombre varchar(70) not null, tipo varchar(30) not null)
AS
BEGIN
DECLARE @idUsuario int = dbo.usuarioExistetest(@usuario);
DECLARE @passCorrecto bit = dbo.passwordCorrectotest(@idUsuario, @password);
INSERT @info
SELECT
usuarios.nombreUsuario, tiposUsuarios.tipoUsuario
FROM
usuarios
LEFT JOIN
tiposUsuarios
ON
usuarios.idTipoUsuario = tiposUsuarios.idTipoUsuario
WHERE
usuarios.idUsuario = @idUsuario and
usuarios.estatus = 'ACTIVO' and
@passCorrecto = 'true';
RETURN
END;
您使用的是什么版本的SQL Server?在2005年或更早的版本中,不能在同一行上声明和设置变量。@LittleBobby-但这会引起语法错误。我怀疑问题一定出在dbo.usuarioExiste(@usuario)@Martin Smith的定义或调用中——我在发布后也想到了这一点,但我想问一下也无妨。@bobby我正在使用sql server 2008@Martin'usuarioExiste(@usuario)')在我这样称呼它时效果很好,“SELECT dbo.usuarioExiste('htorres')”。@idUsuario和@passCorrecto在声明后立即的值是什么?嗨,我已经尝试了具有相同结果的独立语句。。。另外,你能给我解释一下故障保护是如何工作的吗?谢谢,函数中不允许gbnprinting,好吧,当我放入类似PRINT@idUsuarioOK的内容时,它显示了一个错误,请尝试创建另外两个只声明和返回变量值的函数。那么这不是问题所在。尝试在函数声明之外执行Select,以确定问题是否与Select有关。
CREATE FUNCTION [dbo].[login](@usuario varchar(20), @password varchar(20))
RETURNS @info TABLE (nombre varchar(70) not null, tipo varchar(30) not null)
AS
BEGIN
DECLARE @idUsuario int = dbo.usuarioExistetest(@usuario);
DECLARE @passCorrecto bit = dbo.passwordCorrectotest(@idUsuario, @password);
INSERT @info
SELECT
usuarios.nombreUsuario, tiposUsuarios.tipoUsuario
FROM
usuarios
LEFT JOIN
tiposUsuarios
ON
usuarios.idTipoUsuario = tiposUsuarios.idTipoUsuario
WHERE
usuarios.idUsuario = @idUsuario and
usuarios.estatus = 'ACTIVO' and
@passCorrecto = 'true';
RETURN
END;