Как я могу построить массив или таблицу в функции и вернуть ее в SQL Server 2008 - PullRequest
1 голос
/ 22 ноября 2010

Я использую SQL Server 2008 и создаю функцию, которая выбирает некоторые записи
мне нужно отфильтровать эти записи и вернуть некоторые записи

CREATE  PROCEDURE getPlayerLeft  @minDate datetime ,@maxDate datetime ,@minLevel integer, @MaxLevel integer 
AS
declare @acc_id integer
declare @lv integer
DECLARE db_cursor CURSOR FOR  
SELECT DISTINCT account_id, MAX(lv) AS MAXLV
FROM Character
WHERE (logout_time BETWEEN @minDate AND @maxDate) AND (lv BETWEEN @minLevel AND @MaxLevel)
GROUP BY account_id      

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @acc_id,@lv   
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT Character.account, Character.race, Character.job, Character.job_1, Account.email
FROM Character, Account
WHERE (Character.account_id = @acc_id) AND (Character.lv = @lv) AND (Account.account_id = @acc_id)

//here i need to filter these selected record in some condition
//and save them in some collection (if existed) and return it    

FETCH NEXT FROM db_cursor
INTO @acc_id,@lv
END 

CLOSE db_cursor
DEALLOCATE db_cursor 

Большое спасибо!

Ответы [ 4 ]

1 голос
/ 22 ноября 2010

Ваш сохраненный процесс может выглядеть следующим образом.Нет необходимости в курсоре

Также обратите внимание на правильное использование JOIN.

SELECT
   Filtered.*
FROM
    (
    SELECT DISTINCT
          account_id, MAX(lv) AS MAXLV
    FROM
         Character
    WHERE
         (logout_time BETWEEN @minDate AND @maxDate) AND
         (lv BETWEEN @minLevel AND @MaxLevel)
    GROUP BY account_id
    ) FilterOne
    JOIN
    (
    SELECT
        Character.account_id, Character.lv, 
        Character.account, Character.race, Character.job, Character.job_1,
        Account.email
    FROM
        Character
        JOIN
        Account ON Character.account_id = Account.account_id
    ) Filtered
           ON FilterOne.account_id = Filtered.account_id AND FilterOne.MAXLV = Filtered.lv

WHERE
   --add condition here?
0 голосов
/ 22 ноября 2010

Напишите Встроенную функцию , которая использует Общее табличное выражение или подзапрос.

CREATE FUNCTION getPlayerLeft (@minDate datetime, @maxDate datetime, 
                               @minLevel int, @MaxLevel int)
RETURNS TABLE AS RETURN

WITH maxlevel AS
(
    SELECT account_id, MAX(lv) AS lv
    FROM dbo.Character
    WHERE (logout_time BETWEEN @minDate AND @maxDate) 
        AND (lv BETWEEN @minLevel AND @MaxLevel)
    GROUP BY account_id
)
SELECT Character.account, Character.race, Character.job, 
       Character.job_1, Account.email
FROM dbo.Character
INNER JOIN dbo.Account ON Account.account_id = account_id
INNER JOIN maxlevel ON maxlevel.account_id = Character.account_id
                       AND maxlevel.lv = Character.lv

GO

SELECT account, race, job, job_1, email
FROM dbo.getPlayerLeft('2010-01-01', '2010-12-31', 1, 5)
0 голосов
/ 22 ноября 2010

Вы можете вернуть табличные переменные из udfs. Эта ссылка также имеет пример udf, который возвращает один, прокрутите вниз до «Пример: Разделить».

Вы также можете использовать временные таблицы, но убедитесь, что вы создали временную таблицу до того, как вызовет свой sproc, так как выход из sproc вызывает удаление временных таблиц, созданных в нем.

0 голосов
/ 22 ноября 2010
SELECT * INTO #TempTable from [YOUR Query]

Это вставит ваши записи во временную таблицу, тогда последний оператор вашей процедуры должен быть

SELECT * FROM #TempTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...