2014-09-30 3 views
0

Я пытаюсь написать SQL-функцию, но проблема с объявлением переменных, которые мне нужны для использования в предложении WHERE.SQL-запрос help - объявление переменных внутри функции

Вот код:

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, вернуть все„применимое“Policies» «Применимое» политика одна, где бизнес-область, местоположение и тип EmployeeType соответствуют значению пользователя.

Я пытаюсь использовать другую функцию (fn_getEmployeeDetails), чтобы вернуть BusArea, Loc & EmpType для данного пользователя. Тогда с результатами этого (хранится как переменные) я могу запустить мой оператор select, чтобы вернуть политики.

Проблема, с которой я сталкиваюсь, заключается в том, чтобы заставить переменные, объявленные правильно внутри функции.

Любая помощь или советы будут оценены.

Заранее благодарен!

ответ

1

Не зная, какова ваша ошибка на самом деле, я могу только сказать, что вы правильно не используете varchar в качестве типа данных без указания длины.

DECLARE @empLoc varchar объявит varchar длиной 1. Скорее всего, это должно быть что-то вроде varchar(255) или аналогичного.

Во-вторых, чтобы установить переменные, которые нужно будет либо использовать SET и использовать для paranthisis выбирает или установить его в заявлении:

SET @empLoc = (SELECT Location FROM fn_getEmployeeDetails(@employeeid))
или
SELECT @empLoc = Location FROM fn_getEmployeeDetails(@employeeid)

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

EDIT: Основываясь на ваш комментарий Вы не хватает BEGIN после AS, и END перед GO.

В принципе - ваш синтаксис функции смешивает «встроенную» таблицу с функцией «multi-statement».
Такая функция "шаблон" должен выглядеть примерно так:

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)

+0

Спасибо Аллан. В скобках отсортированы операторы select. К сожалению, объявление переменных по-прежнему не работает даже с добавленной длиной. Ошибка, которую я получаю: «неправильный синтаксис рядом с объявлением. Ожидание начала или возврата» – user2190629

+0

Я внесла поправки в свой ответ –

Смежные вопросы