Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询帮助-函数中变量的声明_Sql_Tsql - Fatal编程技术网

SQL查询帮助-函数中变量的声明

SQL查询帮助-函数中变量的声明,sql,tsql,Sql,Tsql,我正在尝试编写一个SQL函数,但是在声明我需要在WHERE子句中使用的变量时遇到了问题 代码如下: CREATE FUNCTION fn_getEmployeePolicies(@employeeid smallint) RETURNS TABLE AS DECLARE @empLoc varchar DECLARE @empBusA varchar DECLARE @empType varchar @empLoc = SELECT Location FROM fn_getEmployeeDe

我正在尝试编写一个SQL函数,但是在声明我需要在WHERE子句中使用的变量时遇到了问题

代码如下:

CREATE FUNCTION fn_getEmployeePolicies(@employeeid smallint)
RETURNS TABLE 
AS
DECLARE @empLoc varchar
DECLARE @empBusA varchar
DECLARE @empType varchar
@empLoc = SELECT Location FROM fn_getEmployeeDetails(@employeeid)
@empBusA = SELECT BusinessArea FROM fn_getEmployeeDetails(@employeeid)
@empType = SELECT Type FROM fn_getEmployeeDetails(@employeeid)
RETURN select PolicyId, PolicyGroupBusinessArea.BusinessArea, policysignoff.PolicyGroupLocation.Location, policysignoff.PolicyGroupEmployeeType.EmployeeType
from policysignoff.PolicyGroupPolicy
LEFT JOIN policysignoff.PolicyGroupBusinessArea on policysignoff.PolicyGroupBusinessArea.PolicyGroupId=policysignoff.PolicyGroupPolicy.PolicyGroupId
LEFT JOIN policysignoff.PolicyGroupLocation on policysignoff.PolicyGroupLocation.PolicyGroupId=policysignoff.PolicyGroupPolicy.PolicyGroupId
LEFT JOIN policysignoff.PolicyGroupEmployeeType on policysignoff.PolicyGroupEmployeeType.PolicyGroupId=policysignoff.PolicyGroupPolicy.PolicyGroupId
where BusinessArea = @empBusA
AND EmployeeType = @empType
AND Location = @empLoc
GO
我试图构建的逻辑是:

'给定employeeId,返回所有适用的保单' 适用的策略是业务领域、位置和员工类型与用户匹配的策略

我试图使用另一个函数fn_getEmployeeDetails返回给定用户的BusArea、Loc和EmpType。 然后,使用存储为变量的结果,我可以运行select语句返回策略

我遇到的问题是试图在函数中正确声明变量

任何帮助或提示都将不胜感激


提前谢谢

在不知道您的错误实际是什么的情况下,我只能说,在使用varchar作为数据类型而不指定长度之后,您的错误是不正确的

DECLARE@empLoc varchar将声明长度为1的varchar。 很可能它应该是varchar255或类似的东西

其次,要设置变量,您需要使用set和paranithis for selects,或者将其设置到语句中:

SET@empLoc=从fn中选择位置_getEmployeeDetails@employeeid 或 从fn中选择@empLoc=位置_getEmployeeDetails@employeeid

这两种方法之间有细微的区别,但就你目前的目的而言,我认为这并不重要

编辑: 根据您的评论,您缺少AS后开始和GO前结束

基本上-函数语法将内联表函数与多语句函数混合在一起。 这样的函数模板应该如下所示:

CREATE FUNCTION <Table_Function_Name, sysname, FunctionName> 
(
    -- Add the parameters for the function here
    <@param1, sysname, @p1> <data_type_for_param1, , int>, 
    <@param2, sysname, @p2> <data_type_for_param2, , char>
)
RETURNS 
<@Table_Variable_Name, sysname, @Table_Var> TABLE 
(
    -- Add the column definitions for the TABLE variable here
    <Column_1, sysname, c1> <Data_Type_For_Column1, , int>, 
    <Column_2, sysname, c2> <Data_Type_For_Column2, , int>
)
AS
BEGIN
    -- Fill the table variable with the rows for your result set
    RETURN 
END
GO

脚本取自sql server management studio

谢谢Allan。括号对select语句进行排序。不幸的是,即使添加了长度,变量的声明仍然不起作用。我得到的错误是:declare附近的语法不正确。我已经修改了我的答案